fwrite
fwrite — バイナリ・モードによるファイル書き込み
説明
int fwrite ( resource handle, string string [, int length] )fwrite()はstringの内容を handleが指しているファイル・ストリームに書き込み ます。lengthパラメータが与えられている場合、 lengthバイト数分の書き込みが完了したか、 stringが終わりに達したかのいずれか早い方の 事象により書き込みは中止されます。
fwrite()は書き込んだバイト数、またはエラー時に FALSE を返します。
length パラメータが指定されている場合、 magic_quotes_runtime 構成オプションは無視され、stringからの スラッシュ文字の取り除きは行われないことに注意してください。
注意: (Windowsのように)バイナリとテキストファイルの形式が異なるシステ ムにおいては、ファイルをオープンする際に fopen()の mode パラメータに 'b' を指定する必 要があります。
例 614. fwrite() の簡単な例
<?php
$filename = 'test.txt';
$somecontent = "Add this to the file\n";
// ファイルが存在しかつ書き込み可能かどうか確認します
if (is_writable($filename)) {
// この例では$filenameを追加モードでオープンします。
// ファイルポインタはファイルの終端になりますので
// そこがfwrite()で$somecontentが追加される位置になります。
if (!$handle = fopen($filename, 'a')) {
echo "Cannot open file ($filename)";
exit;
}
// オープンしたファイルに$somecontentを書き込みます
if (fwrite($handle, $somecontent) === FALSE) {
echo "Cannot write to file ($filename)";
exit;
}
echo "Success, wrote ($somecontent) to file ($filename)";
fclose($handle);
} else {
echo "The file $filename is not writable";
}
?>
fread(), fopen(), fsockopen(), popen(), file_put_contents() も参照ください。
fwrite
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/05 16:38 UTC 版)
ナビゲーションに移動 検索に移動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 マニュアル
固有名詞の分類
- fwriteのページへのリンク