ショウのプログラミング教室

[C言語][C++]ファイルの入出力[サンプルコードあり]

こんにちはショウです
今日はC言語、C++でのファイルの入出力について紹介します
サンプルを記載していますので参考にしてください

サンプルソース

早速サンプルのソースを見ながら説明していきます

バイナリファイルの書き込み

bool WriteBinFile(char *fileName, void *data, short elementSize, short length){
	FILE* fp;
	short cnt;

	if(fopen_s(&fp, fileName, "wb") != 0){
		return false;
	}
	cnt = fwrite(data, elementSize, length, fp);
	if(cnt == 0){
		fclose(fp);
		return false;
	}

	fclose(fp);
	return true;
}

fopen_sにて引数で指定されたファイル名のファイルをオープンします
fcloseにてファイルをクローズします
ファイルの操作を行う場合には必須の処理です

fopen_sの第3引数でファイルのオープンモードを指定します

[table id=1 /]

fwriteにてバイナリデータを書き込みします

引数

size_t fwrite(
    const void * restrict ptr,
    size_t size,
    size_t nmemb,
    FILE * stream
);
  • ptr: 書き込むデータへのポインタ
  • size: 要素 1 個あたりの大きさ
  • nmemb: 要素の個数
  • stream: ファイルポインタ

戻り値

  • 成功時: 書き込みした要素の個数 (バイト数ではない)
  • 失敗時: 0

バイナリファイルの読み込み

bool ReadBinFile(char *fileName, void *data, short elementSize, short length){
	FILE* fp;
	short cnt;

	if(fopen_s(&fp, fileName, "rb") != 0){
		return false;
	}
	cnt = fread(data, elementSize, length, fp);
	if(cnt == 0){
		fclose(fp);
		return false;
	}

	fclose(fp);
	return true;
}

freadにてバイナリデータを読み込みます

引数

size_t fread(
    void * restrict ptr,
    size_t size,
    size_t nmemb,
    FILE * stream
);
  • ptr: 読み込む領域へのポインタ
  • size: 要素 1 個あたりの大きさ
  • nmemb: 要素の個数
  • stream: ファイルポインタ

戻り値

  • 成功時: 読み込みした要素の個数 (バイト数ではない)
  • 失敗時: 0

テキストファイルの書き込み

bool WriteTxtFile(char *fileName, char *data){
	FILE* fp;
	short cnt;

	if(fopen_s(&fp, fileName, "w") != 0){
		return false;
	}
	cnt = fputs(data, fp);
	if(cnt == 0){
		fclose(fp);
		return false;
	}

	fclose(fp);
	return true;
}

fputsにてファイルに1行の文字列を書き込みます

引数

int fputs (
    const char * s,
    FILE * stream
);
  • s: ストリームに書き込みたい文字列
  • stream: ファイルポインタ

戻り値

  • 成功時: 正の値
  • 失敗時: EOF

テキストファイルの読み込み

bool ReadTxtFile(char *fileName, char *data, short maxSize){
	FILE* fp;
	char *ptr;
	short cnt;

	if(fopen_s(&fp, fileName, "r") != 0){
		return false;
	}
	ptr = fgets(data, maxSize, fp);
	if(ptr == NULL){
		fclose(fp);
		return false;
	}

	fclose(fp);
	return true;
}

fgetsにてファイルから1行文字列を読み込みます

引数

char *fgets(
    char * s,
    int n,
    FILE * stream
);
  • s: ストリームに書き込みたい文字列
  • n: 1 行の最大文字数
  • stream: ファイルポインタ

戻り値

  • 成功時: 読み取った文字
  • ファイルの終端時:NULL
  • 失敗時: NULL

各関数の使い方

void main(){
	char writeData[DATA_LENGTH] = "test data\n";
	char readData[DATA_LENGTH];

	if(WriteBinFile("test.bin", writeData, sizeof(char), DATA_LENGTH)){
		printf("書き込み完了\n");
	}

	if(ReadBinFile("test.bin", readData, sizeof(char), DATA_LENGTH)){
		printf("読み込み完了\n");
		printf("%s", readData);
	}

	short writeValue[DATA_LENGTH] = {1,2,3,4,5,6,7,8,9,10};
	short readValue[DATA_LENGTH];
	
	if(WriteBinFile("test.bin", &writeValue, sizeof(short), DATA_LENGTH)){
		printf("書き込み完了\n");
	}

	if(ReadBinFile("test.bin", &readValue, sizeof(short), DATA_LENGTH)){
		printf("読み込み完了\n");
		for(int i=0; i < DATA_LENGTH; i++)
			printf("%d\n", readValue[i]);
	}

	
	char writeTxtData[DATA_LENGTH] = "test txt data\n";
	char readTxtData[DATA_LENGTH];

	if(WriteTxtFile("test.txt", writeTxtData)){
		printf("書き込み完了\n");
	}

	if(ReadTxtFile("test.txt", readTxtData, DATA_LENGTH)){
		printf("読み込み完了\n");
		printf("%s", readTxtData);
	}

	printf("終了するにはエンターキーを入力してください\n");
	getchar();
}

実行結果

mainを実行した際の結果は下記となります

書き込み完了
読み込み完了
test data
書き込み完了
読み込み完了
1
2
3
4
5
6
7
8
9
10
0
0
0
0
0
0
読み込み完了
test txt data
終了するにはエンターキーを入力してください

モバイルバージョンを終了