こんにちはショウです
今日は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
終了するにはエンターキーを入力してください