fwrite関数 - バイト数を指定してファイルへ書き込み

fwrite関数を使うと、バイト数を指定してファイルへ書き込むことができます。stdio.hヘッダを書き込むと使えます。

#include <stdio.h>
size_t fwrite(const void *buf, size_t size, size_t n, FILE *fp);

第一引数は、書き込みたい内容が含まれたバッファです。第二引数は、書き込むデータのバイトの単位です。第三引数は、書き込むデータの個数です。実際に書き込まれるバイトサイズは「size * n」になります。第四引数は、書き込みたいファイルのファイルストリームです。

戻り値は、書き込んだデータの個数です。第三引数で指定したデータの個数に対応しています。バイトサイズではないので注意してください。書き込みエラーが発生した場合、戻り値は、第三引数で指定したデータの個数より小さくなります。

fwrite関数で書き込むサンプル

fwrite関数で書き込むサンプルです。fopen関数でファイルを開き、fread関数で、4バイトずつ読み込み、fwrite関数で4バイトづつファイルに書き込み、fclose関数でファイルを閉じています。

ファイルは、読み書きする場合に、バイナリモードで開いています。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main(void) {
  
  // ファイルを読み込みモードで開く
  const char* in_file = "input.txt";
  FILE* in_fp = fopen(in_file, "rb");
  if (in_fp == NULL) {
    fprintf(stderr, "Can't open file %s\n", in_file);
    exit(1);
  }

  // ファイルを書き込みモードで開く
  const char* out_file = "output.txt";
  FILE* out_fp = fopen(out_file, "wb");
  if (out_fp == NULL) {
    fprintf(stderr, "Can't open file %s\n", out_file);
    exit(1);
  }

  // 読み込んで、他のファイルに出力
  while(1) {
    
    // 4バイトづつ読み込み
    char buffer[16];
    int32_t read_unit = 1;
    int32_t read_count = 4;
    size_t real_read_count = fread(buffer, read_unit, read_count, in_fp);
    
    // 4バイトづつ書き込み
    fwrite(buffer, read_unit, real_read_count, out_fp);
    
    if (real_read_count < read_count) {
      break;
    }
  }
  
  // fclose関数でファイルを閉じる
  fclose(in_fp);
}

入力ファイル「input.txt」です。

Hello
World!

出力ファイル「output.txt」です。

Hello
World!

ファイル全体を読み書きする

ファイル全体を読み書きするサンプルです。ftell関数fseek関数を使って、ファイルのサイズを取得して、calloc関数でメモリを確保し、fread関数で、ファイル全体を読み込み、fwrite関数で、書き込んでいます。

ファイルは、読み書きする場合に、バイナリモードで開いています。

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

int main(void) {
  // ファイルを開く
  const char* in_file = "input.txt";
  FILE* in_fp = fopen(in_file, "rb");
  if (in_fp == NULL) {
    fprintf(stderr, "Can't open file %s at %s line %d\n", in_file, __FILE__, __LINE__);
    exit(1);
  }

  // ファイルを書き込みモードで開く
  const char* out_file = "output.txt";
  FILE* out_fp = fopen(out_file, "wb");
  if (out_fp == NULL) {
    fprintf(stderr, "Can't open file %s\n", out_file);
    exit(1);
  }

  // ファイルの末尾に位置指定子を移動
  fseek(in_fp, 0, SEEK_END);
  
  // ファイルの末尾の位置を取得。これは、ファイサイズになります。
  size_t file_size = (int32_t)ftell(in_fp);
  
  // メモリ確保
  char* buffer = calloc(file_size + 1, sizeof(char));

  // ファイルの先頭に位置指定子を移動
  fseek(in_fp, 0, SEEK_SET);
  
  // ファイルを読み込み
  size_t read_count = fread(buffer, sizeof(char), file_size, in_fp);
  if (read_count != file_size) {
    fprintf(stderr, "Can't read file %s at %s line %d\n", in_file, __FILE__, __LINE__);
    exit(1);
  }
  
  // 出力ファイルへ書き込み
  fwrite(buffer, sizeof(char), file_size, out_fp);
  
  // ファイルを閉じる
  fclose(in_fp);
}

入力ファイル「input.txt」です。

Hello
World!

出力ファイル「output.txt」です。

Hello
World!

関連情報