備忘録

プログラムやゲーム関連に関すること

【C++】ストリーム

ストリームの階層

http://upload.cppreference.com/mwiki/images/0/06/std-io-complete-inheritance.svg
引用:Input/output library - cppreference.com

ファイルモード

std::ios::app // 追加出力
std::ios::ate // 開く時にEOFまで移動する
std::ios::binary // ファイルをバイナリモードで開く
std::ios::in // 読み込み専用で開く
std::ios::out // 出力用にファイルを開く
std::ios::trunc // 既存のファイルを上書きする

#include <iostream>
#include <fstream>

int main()
{
	// 出力内容
	auto output = [](std::ostream &os)
	{
		os << "Hello World!" << std::endl;
		os << "123.456.789" << std::endl;
	};

	// コンソールに出力する
	output(std::cout);

	// テキスト(外部ファイル)に出力する
	std::ofstream ofs0("test.txt", std::ios::out);
	if (!ofs0) { std::exit(EXIT_FAILURE); }
	output(ofs0);
	ofs0.close();

	// 一文字単位で割り当てる
	std::ifstream ifs0("test.txt", std::ios::in);
	if (!ifs0) { std::exit(EXIT_FAILURE); }
	char c;
	while (ifs0.get(c)) { std::cout << c; }
	ifs0.close();

	// 一行単位で割り当てる
	std::ifstream ifs1("test.txt", std::ios::in);
	if (!ifs1) { std::exit(EXIT_FAILURE); }
	char str1[256] = {0};
	while (ifs1.getline(str1, 255, '.')) { std::cout << str1; } // 区切り文字 OK
	ifs1.close();

	// バイナリからサイズを指定して割り当てる
	std::ifstream ifs2("test.txt", std::ios::in | std::ios::binary);
	if (!ifs2) { std::exit(EXIT_FAILURE); }
	char str2[256] = {0};
	ifs2.read((char*)str2, sizeof(str2));
	std::cout << str2;
	ifs2.close();

	// 動的にメモリを確保して割り当てる
	std::ifstream ifs3("test.txt", std::ios::in);
	if (!ifs3) { std::exit(EXIT_FAILURE); }
	ifs3.seekg(0, std::ios::end);
	auto size = static_cast<unsigned>(ifs3.tellg()) / sizeof(char);
	auto str3 = new char[size];
	memset(str3, 0, size);
	ifs3.seekg(0, std::ios::beg);
	ifs3.read(str3, size);
	std::cout << str3;
	ifs3.close();
	delete [] str3;

	// write 書き出し
	std::ofstream ofs1;
	ofs1.open("write_test.txt", std::ios::out | std::ios::trunc | std::ios::binary);

	// 文字列の書き込み
	//ofs1.write("リテラル文字は直接書き込み可能\n", 31);

	// 数値の書き込み
	int n = 100;
	ofs1.write(reinterpret_cast<char*>(&n), sizeof(int));
	ofs1.close();

	// 数値の読み込み
	std::ifstream ifs4("write_test.txt", std::ios::in | std::ios::binary);
	if (!ifs4) { exit(EXIT_FAILURE); }
	int n2 = 0;
	ifs4.read(reinterpret_cast<char*>(&n2), sizeof(int));
	std::cout << n2 << std::endl; // 100
	ifs4.close();

	std::cout << "正常終了" << std::endl;

	return 0;
}

引用:ファイル入出力をごっちゃにしないために
参考:C++入出力

std::stringstream については以下を参照

引用:std::stringstream再考 « Stop Making Sense