保存機能への道

fopenを使おうと思ったけど、やっぱりCreateFileを使うことにした。
ころころ変わるね……えへへ……。


一行(改行まで)読み込んで作業するというパターンだから、fgetsを使えば良いのだけど、
バッファでサイズ指定しないといけないのがどうにも好きではない仕様……。
ということで、ReadFileで一文字ずつ読み込んで、
改行を見つけたら処理を実行するという方法をとることにした。
これも、原始的だけどね!


ということで、ReadFileで一文字ずつ読み込んで改行するサンプルソースを書いてみた。
とりあえず、サンプルなんで、改行したら、メッセージボックスに投げている。
この箇所が、fgetsで情報を取得したのと同じ。
stringだから、バッファを気にし無くて良い。
あと、switchを使ったので、改行文字以外を加えていくのも容易……という程度。

// 前略
int		readFile(
const char *	fileName
)
{
	HANDLE	hFile;
	DWORD	wReadSize;
	
	hFile = CreateFile(fileName,
		GENERIC_READ,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_READONLY,
		NULL);
	
	if (hFile == INVALID_HANDLE_VALUE) return -1;
	
	string	str;
	char	c;
	while (ReadFile(hFile, &c, 1, &wReadSize, NULL) != 0) {
		// 読み込み対象がなくなったら終了
		if (wReadSize == 0) break;
		
		switch (c) {
		case '\n':
			if (str.size()) {
				MessageBox(NULL,
					str.c_str(),
					str.c_str(),
					0);
			}
			// 文字列初期化
			str = "";
			break;
		default:
			str += c;
			break;
		}
	}
	if (str.size()) {
		MessageBox(NULL,
			str.c_str(),
			str.c_str(),
			0);
	}
	
	CloseHandle(hFile);
	
	return 0;
}
// 後略


「保存機能」と言いつつ、読み込みから作っている不思議。