fwrite

ウィキペディアから無料の百科事典

fwriteは、C言語の標準入出力ヘッダー <stdio.h> で宣言されている関数である。 主に、バイナリ形式のファイル出力に使われる。

形式[編集]

ISO/IEC 9899:1999 では、以下のように定義されている[1]

概要
#include <stdio.h> size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); 
説明
fwrite関数は、ptrが指す配列から、sizeで指定された大きさを持つ要素を最大nmemb個まで、streamが指すストリームに書き込む。各オブジェクトに対して、オブジェクトの上に正確に重なっているunsigned charの配列から値を(順に)取得しながら、fputc関数がsize回だけ呼び出される。ストリームのファイル位置指示子[注釈 1](定義されている場合)は、正常に書き込まれた文字数だけ進む。エラーが発生した場合、ストリームのファイル位置指示子の結果は不定である。
返却値
fwrite関数は、書き込みに成功した要素の数を返すが、書き込みエラーが発生した場合のみ、nmembよりも小さくなる。sizeまたはnmembがゼロの場合、fwriteはゼロを返し、ストリームの状態は変更されない。

ISO/IEC 9899:2018 でも同様である[2]

テキストモード[編集]

streamがテキストモードで開かれていた場合、改行コードLFは書き込みの際にCR+LFで置換される処理系もある[3]。詳細は各処理系のリファレンスを参照のこと。

コード例[編集]

ユーザーの入力を受け取り、バイナリモードで sample.dat に書き込んだ後、読み込んで表示する。

#include <stdio.h> #include <string.h>  static void printDoubleAsBigEndianHexBytes(double x) {     unsigned char buf[sizeof(double)];     size_t i;     memcpy(buf, &x, sizeof(double));     printf("0x");     for (i = 0; i < sizeof(double); ++i) {         printf("%02x", buf[i]);     }     puts(""); }  int main(void) {     const char* const fileName = "sample.dat";     FILE* fp;     double v;     size_t len;      puts("Input a real number:");     if (scanf("%lf", &v) != 1) {         fprintf(stderr, "Failed to read a number from stdin.\n");         return -1;     }     printDoubleAsBigEndianHexBytes(v);      /* ファイルへの書き込み */     fp = fopen(fileName, "wb");     if (fp == NULL) {         fprintf(stderr, "Cannot open \"%s\" in write mode.\n", fileName);         return -1;     }     len = fwrite(&v, sizeof(double), 1, fp);      if (len != 1) {         fclose(fp);         fprintf(stderr, "Failed to write to \"%s\".\n", fileName);         return -1;     }     fclose(fp);      /* ファイルからの読み込み */     fp = fopen(fileName, "rb");     if (fp == NULL) {         fprintf(stderr, "Cannot open \"%s\" in read mode.\n", fileName);         return -1;     }     len = fread(&v, sizeof(double), 1, fp);     if (len != 1) {         fclose(fp);         fprintf(stderr, "Failed to read from \"%s\".\n", fileName);         return -1;     }     fclose(fp);     printf("Read value: %f\n", v);     printDoubleAsBigEndianHexBytes(v);      return 0; } 

なお、標準Cの言語仕様では、sizeof(double)の結果は規定されていない。doubleの値がIEEE 754準拠の倍精度浮動小数点数表現であることも規定されておらず、エンディアンも規定されていない。そのため、上記のコードによって生成されたバイナリファイルが、異なるプラットフォームでも同じように読み込めるとは限らない。

脚注[編集]

注釈[編集]

  1. ^ ISO/IEC 9899:1999 の position indicator は、JIS X 3010:2003 では「位置表示子」と訳されている。

出典[編集]

関連項目[編集]

外部リンク[編集]