fwriteは、C言語の標準入出力ヘッダー <stdio.h> で宣言されている関数である。 主に、バイナリ形式のファイル出力に使われる。
形式 ISO/IEC 9899:1999 では、以下のように定義されているISO/IEC 9899:1999 TC3 | WG14/N1256, Committee Draft | Septermber 7, 2007 | 7.19.8.2 The fwrite function。
概要 #include <stdio.h> size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); 説明 fwrite関数は、ptrが指す配列から、sizeで指定された大きさを持つ要素を最大nmemb個まで、streamが指すストリームに書き込む。各オブジェクトに対して、オブジェクトの上に正確に重なっているの配列から値を(順に)取得しながら、fputc関数がsize回だけ呼び出される。ストリームのファイル位置指示子(定義されている場合)は、正常に書き込まれた文字数だけ進む。エラーが発生した場合、ストリームのファイル位置指示子の結果は不定である。 返却値 fwrite関数は、書き込みに成功した要素の数を返すが、書き込みエラーが発生した場合のみ、nmembよりも小さくなる。sizeまたはnmembがゼロの場合、fwriteはゼロを返し、ストリームの状態は変更されない。
ISO/IEC 9899:2018 でも同様である。
テキストモード streamがテキストモードで開かれていた場合、改行コードLFは書き込みの際にCR+LFで置換される処理系もあるfwrite | Microsoft Docs。詳細は各処理系のリファレンスを参照のこと。
コード例 ユーザーの入力を受け取り、バイナリモードで 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の言語仕様では、の結果は規定されていない。の値がIEEE 754準拠の倍精度浮動小数点数表現であることも規定されておらず、エンディアンも規定されていない。そのため、上記のコードによって生成されたバイナリファイルが、異なるプラットフォームでも同じように読み込めるとは限らない。
脚注 注釈
出典
関連項目 fread fputc 標準Cライブラリ
外部リンク
en:C file input/output#fwrite