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