C言語学習記録2 fread fwriteを使ったファイル入出力
fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fread() 関数は stream ポインタで指定されたストリームから nmemb 個のデータを読み込み、 ptr で与えられた場所に格納する。個々のデータは size バイトの長さを持つ。
fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
fwrite() 関数は ptr で指定された場所から得た nmemb 個のデータを、 stream ポインタで指定されたストリームに書き込む。個々のデータは size バイトの長さを持つ。
ランダムに生成した100個の整数をfwriteを使って書き込み
#include<stdio.h> #include<stdlib.h> // rand(), exit() int main(void) { int num, i; char *file_name = "rand"; FILE *fp; if ((fp = fopen(file_name, "wb")) == NULL) { perror(file_name); exit(1); } for (i=0;i<100;i++){ num = rand(); if (fwrite(&num, sizeof(num), 1, fp) != 1) { perror(file_name); exit(1); } } if (fclose(fp) == EOF) { perror(file_name); exit(1); } return 0; }
上記で作成したファイルをfreadを使って読み込み
#include<stdio.h> #include<stdlib.h> // rand(), exit() int main(void) { int num, i; char *file_name = "rand"; FILE *fp; if ((fp = fopen(file_name, "rb")) == NULL) { perror(file_name); exit(1); } for (i=0;i<100;i++){ num = rand(); if (fread(&num, sizeof(num), 1, fp) != 1) { perror(file_name); exit(1); } printf("%d ", num); } if (fclose(fp) == EOF) { perror(file_name); exit(1); } return 0; }
実行例
1804289383 846930886 1681692777 1714636915 (以下省略)
odコマンドで確認した結果とも一致する
$ od -td4 rand 0000000 1804289383 846930886 1681692777 1714636915 (以下省略)
fseekを使って指定した順番の数字を表示
#include<stdio.h> #include<stdlib.h> // exit() #include<string.h> // strchr(), strlen() int main(void) { int num; long i; char *file_name = "rand"; char buf[80]; FILE *fp; if ((fp = fopen(file_name, "rb")) == NULL) { perror(file_name); exit(1); } printf("何番目の数字を表示したいですか?: "); if (fgets(buf, sizeof(buf), stdin) == NULL) { printf("入力エラー\n"); exit(1); } if (strchr(buf, '\n') != NULL) { buf[strlen(buf) - 1] = '\0'; } else { fprintf(stderr, "一行に入力可能な最大文字数(%d文字)をオーバーしました\n", sizeof(buf) -1 ); exit(1); } i = atoi(buf) - 1; if (fseek(fp, i * sizeof(int), SEEK_SET)) { fprintf(stderr, "シークエラー\n"); exit(1); } if (fread(&num, sizeof(num), 1, fp) != 1) { perror(file_name); exit(1); } printf("%d ", num); if (fclose(fp) == EOF) { perror(file_name); exit(1); } return 0; }
実行例
何番目の数字を表示したいですか?: 100 1956297539