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準拠の倍精度浮動小数点数表現であることも規定されておらず、エンディアンも規定されていない。そのため、上記のコードによって生成されたバイナリファイルが、異なるプラットフォームでも同じように読み込めるとは限らない。
脚注
[編集]注釈
[編集]- ^ ISO/IEC 9899:1999 の position indicator は、JIS X 3010:2003 では「位置表示子」と訳されている。
出典
[編集]- ^ ISO/IEC 9899:1999 TC3 | WG14/N1256, Committee Draft | Septermber 7, 2007 | 7.19.8.2 The fwrite function
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 244, §7.21.8.2 The fwrite function. オリジナルの2018-12-30時点におけるアーカイブ。
- ^ fwrite | Microsoft Docs
関連項目
[編集]外部リンク
[編集]fwrite(3)
– JM Project Linux Library Functions マニュアル