ファイルへの入出力に関する型や変数は、stdio.h にある。
テキストファイル
書き込み
fopen("./test.txt", "w") で書き込みモードのフィアルポインタ。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *file;
// ファイルポインタ
file = fopen("./test.txt", "w");
// ファイルが開けない場合は異常終了
if (file==NULL) {
printf("Can not open a file...\n");
exit(1);
}
fprintf(file, "Hello Fisrt World!\n");
fprintf(file, "Hello Second World!\n");
fclose(file);
return 0;
}
読み込み
file = fopen("./test.txt", "r"); で読み込みモードのファイルポインタ。
1行ごとの読み込み
char * fgets( char *row , int len , FILE *fp );
ファイルポインタfpから1行、またはlenバイト読み込んでその先頭アドレスを返す。全行を読み込んだ場合、又はエラー時にNULL(\0)を返す。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 256
int main(void) {
FILE *file;
char row[SIZE];
row[0] = '\0';
// ファイルポインタ
file = fopen("./test.txt", "r");
// ファイルが開けない場合は異常終了
if (file==NULL) {
printf("Can not open a file...\n");
exit(1);
}
while (fgets(row, SIZE, file) != NULL) {
printf("%s", row);
}
fclose(file);
return 0;
}
1文字ごとの読み込み
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *file;
int c;
file = fopen("test.txt", "r");
if (file == NULL) {
printf("can not open file...\n");
exit(1);
}
while ((c = fgetc(file)) != EOF) {
printf("%c", (char)c);
}
fclose(file);
return 0;
}
バイナリファイル
書き込み
fopen("test.bin", "wb"); でバイナリファイル書き込みのポインタ。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *file;
char data[] = {0x11, 0x1f, 0x21, 0x2f};
file = fopen("test.bin", "wb");
if (file == NULL) {
printf("can not open file...\n");
exit(1);
}
fwrite(data, sizeof(char), sizeof(data), file);
fclose(file);
return 0;
}
読み込み
fopen("test.bin", "rb"); でバイナリファイル読み込み用のポインタ。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *file;
char data[4];
int i;
file = fopen("test.bin", "rb");
if (file == NULL) {
printf("can not open file...\n");
exit(1);
}
fread(data, sizeof(char), sizeof(data), file);
fclose(file);
for (i=0; i<sizeof(data); i++) {
printf("0x%x ", data[i]);
}
printf("\n");
return 0;
}
読み込みファイルのサイズがわかない場合は、malloc で動的に読み込みを保存するメモリを確保する。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE* file;
long int size;
int i;
char* data;
file = fopen("./test.bin", "rb");
if (file == NULL) {
printf("can not open file...\n");
exit(1);
}
// ファイルサイズの取得 fseek してftell
fseek(file, 0, SEEK_END);
size = ftell(file);
// malloc で動的に配列を生成
data = (char*)malloc(sizeof(char)*(long unsigned int)size);
// 先頭に戻り、ファイルを読み込む。
fseek(file, 0, SEEK_SET);
fread(data, sizeof(char), (long unsigned int)size, file);
fclose(file);
for (i=0; i<size; i++) {
printf("0x%x ", data[i]);
}
printf("\n");
free(data);
return 0;
}