先看下面一個小程序:
int main(int argc, _TCHAR* argv[])
{
FILE *fp=fopen("1.txt","r+");
fputc('x',fp);
fputc('x',fp);
fputc('x',fp);
return 0;
}
1.txt文件內容為abcdefg,調用函數之后為axxxefg,恩,正確
int main(int argc, _TCHAR* argv[])
{
FILE *fp=fopen("1.txt","rb+");
char c=fgetc(fp);
fputc('x',fp);
fputc('x',fp);
fputc('x',fp);
return 0;
}
而上面的這個程序只是加了一句fgetc,調用后卻失去了作用,文件內容沒有發生變化,仍然為abcdefg,為什么呢?(該問題在Linux下已不存在)
《Unix環境高級編程》在使用讀寫方式打開文件時(type中的+號),輸出的后面不能直接跟輸入,輸入的后面也不能直接跟輸出,否則可能會出錯。如果需要輸出輸入相連,則中間
需調用fflush,fseek,fsetpos或rewind等操作。
既然這樣,那我們試一下,看看能不能解決問題,在上面代碼中fgetc和fputc中間加入
fpos_t pos;
fgetpos(fp,&pos);
fsetpos(fp,&pos);
之后,運行程序,果真可以解決問題。
C語言的標準I/O庫函數由于使用緩存的原因,在使用時可能出現各種各樣的問題,尤其是在那種即時性比較強的I/O中,使用時要慎重。盡量使用其他的I/O函數代替之。