#4
by かずま » 7年前
ABA さんが書きました:
これまで自分の想像ではC言語の関数が書き込んでから、はじめて次の文に行くとしましたが、実際そうでないと実証しました。
その実証が間違っていないことを実証してください。
ABA さんが書きました:
さて、どうすれば、直前の書き込み完成してから、直後の読み込みを実行することができるのでしょうか。
コード:
#include <stdio.h>
int main(void)
{
char buf[1024];
FILE *fin, *fout;
fout = fopen("a.txt", "w");
if (fout == NULL) { puts("can't create b.txt"); return 2; }
fin = fopen("a.txt", "r");
if (fin == NULL) { puts("can't open a.txt"); return 1; }
fputs("abcdefg\n", fout); // または fprintf(fout, "abcdefg\n");
fflush(fout); // これがあるとないとで大違い
if (fgets(buf, sizeof buf, fin) != NULL)
fputs(buf, stdout);
else
printf("can't read a line\n");
fclose(fout);
fclose(fin);
return 0;
}
書式による書き込み fprintf、
文字列書き込み fputs、
1文字書き込み fputc、
指定バイト数書き込み fwrite、
これらは、バッファリングしているバッファへの書き込みであり、
実際のファイルへの書き込みは、バッファがいっぱいになった時に
自動的に行われます。
したがって、書き込んだつもりでも、ファイルに本当に書き込みが
完了しているとは限りません。
fflush があると、バッファリングしているデータをすべてファイルに
書き込みます。
fclose もバッファリングしているデータをすべてファイルに書き
込んでから、ファイルをクローズします。
[quote="ABA" id=3,19222,145587]
これまで自分の想像ではC言語の関数が書き込んでから、はじめて次の文に行くとしましたが、実際そうでないと実証しました。[/quote]
その実証が間違っていないことを実証してください。
[quote="ABA" id=3,19222,145587]
さて、どうすれば、直前の書き込み完成してから、直後の読み込みを実行することができるのでしょうか。[/quote]
[code=c]
#include <stdio.h>
int main(void)
{
char buf[1024];
FILE *fin, *fout;
fout = fopen("a.txt", "w");
if (fout == NULL) { puts("can't create b.txt"); return 2; }
fin = fopen("a.txt", "r");
if (fin == NULL) { puts("can't open a.txt"); return 1; }
fputs("abcdefg\n", fout); // または fprintf(fout, "abcdefg\n");
fflush(fout); // これがあるとないとで大違い
if (fgets(buf, sizeof buf, fin) != NULL)
fputs(buf, stdout);
else
printf("can't read a line\n");
fclose(fout);
fclose(fin);
return 0;
}
[/code]
書式による書き込み fprintf、
文字列書き込み fputs、
1文字書き込み fputc、
指定バイト数書き込み fwrite、
これらは、バッファリングしているバッファへの書き込みであり、
実際のファイルへの書き込みは、バッファがいっぱいになった時に
自動的に行われます。
したがって、書き込んだつもりでも、ファイルに本当に書き込みが
完了しているとは限りません。
fflush があると、バッファリングしているデータをすべてファイルに
書き込みます。
fclose もバッファリングしているデータをすべてファイルに書き
込んでから、ファイルをクローズします。