ファイル操作 -ソース-

■ファイルオープン、クローズ

●ファイルを開いて閉じるだけのソース例:
	#include <stdio.h>

	void main(void)
	{
		FILE *fp = NULL;	// ファイルポインタ
		// test.txtファイルを読み込みモードで開く
		fopen_s(&fp, "test.txt", "r");

		// fpがNULL以外の値が入ってるならオープン成功
		if (fp != NULL) 
		{
			// test.txtファイルを閉じる
			fclose(fp);
		} else {
			printf("ファイルオープンエラー\n");
		}
	}

■ファイル読み込み(テキストモード)

●fgetsでテキストファイルの中身を取得して表示するソース例:

	・fgetsの戻り値がNULLまでループする:

		#include <stdio.h>

		void main(void)
		{
			FILE *fp = NULL;	// ファイルポインタ

			// test.txtファイルを読み込みモードで開く
			fopen_s(&fp, "test.txt", "r");

			if (fp != NULL)
			{
				// 文字格納用の配列
				char buffer[256] = {};
				char *str = NULL;

				while ((str = fgets(buffer, 256, fp)) != NULL)
				{
					printf("%s", buffer);
					printf("%s", str);
				}

				// test.txtファイルを閉じる
				fclose(fp);
			} else {
				printf("ファイルオープンエラー\n");
			}
		}

	・ファイルポインタがEOFか調べる
		#include <stdio.h>

		void main(void)
		{
			FILE *fp = NULL;

			// test.txtファイルを読み込みモードで開く
			fopen_s(&fp, "test.txt", "r");

			if (fp != NULL)
			{
				while (true)
				{
					// 文字格納用の配列
					char buffer[256] = {};

					// fgets => ファイルから一行分をbufferに取得
					fgets(buffer, 256, fp);
					printf("%s", buffer);

					// EOFチェック
					if (feof(fp) != 0)
					{
						break;
					}
				}

				// test.txtファイルを閉じる
				fclose(fp);
			} else {
				printf("ファイルオープンエラー\n");
			}
		}

■ファイル書き込み(テキストモード)

●fputs、fprintfでファイルに書き込みを行う
	#include <stdio.h>

	void main(void)
	{
		FILE *fp = NULL;

		// test2.txtファイルを書き込みモードで開く
		fopen_s(&fp, "test2.txt", "w");

		if (fp != NULL)
		{
			fputs("fputs write\n", fp);

			fprintf(fp, "fprintf write\n");

			// test2.txtファイルを閉じる
			fclose(fp);
		} else {
			printf("ファイルオープンエラー\n");
		}
	}

■ファイル読み込み(バイナリモード)

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

// #define DEBUG	// DEBUG用define

void main(void)
{
	FILE *fp = NULL;

	// test.txtファイルを読み込みモードで開く
	fopen_s(&fp, "test.txt", "rb");

	if (fp != NULL)
	{
		int size = 0;
		char *buffer = NULL;

		// ファイルサイズ取得
		fseek(fp, 0, SEEK_END);
		size = ftell(fp);
		fseek(fp, 0, SEEK_SET);

		// メモリの動的確保
		buffer = (char*)malloc(size);
		memset(buffer, 0, sizeof(char) * size);
#ifdef DEBUG
		for (int i = 0; i < size; i++)
		{
			printf("buffer[%d] =%d\n", i, buffer[i]);
		}
#endif
		fread(buffer, sizeof(char) * size, 1, fp);
#ifdef DEBUG
		for (int i = 0; i < size; i++)
		{
			printf("buffer[%d] =%d\n", i, buffer[i]);
		}
#endif
		printf("%s", buffer);

		// test2.txtファイルを閉じる
		fclose(fp);
		// 動的メモリの開放
		free(buffer);
	} else {
		printf("ファイルオープンエラー\n");
	}
}

■ファイル書き込み(バイナリモード)

#include <stdio.h>

void main(void)
{
	FILE *fp = NULL;
	// test3.txtファイルを書き込みモードで開く
	fopen_s(&fp, "test3.txt", "wb");

	if (fp != NULL)
	{
		char test[26] = {};
		for (int i = 0; i < 26; i++)
		{
			test[i] = 'A' + i;
		}

		// 26バイトを1回で書き込む
		fwrite(test, sizeof(char) * 26, 1, fp);

		// ファイルを閉じる
		fclose(fp);
	}
}