先看下面一個(gè)小程序:
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文件內(nèi)容為abcdefg,調(diào)用函數(shù)之后為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;
}
而上面的這個(gè)程序只是加了一句fgetc,調(diào)用后卻失去了作用,文件內(nèi)容沒(méi)有發(fā)生變化,仍然為abcdefg,為什么呢?(該問(wèn)題在Linux下已不存在)
《Unix環(huán)境高級(jí)編程》在使用讀寫(xiě)方式打開(kāi)文件時(shí)(type中的+號(hào)),輸出的后面不能直接跟輸入,輸入的后面也不能直接跟輸出,否則可能會(huì)出錯(cuò)。如果需要輸出輸入相連,則中間
需調(diào)用fflush,fseek,fsetpos或rewind等操作。
既然這樣,那我們?cè)囈幌拢纯茨懿荒芙鉀Q問(wèn)題,在上面代碼中fgetc和fputc中間加入
fpos_t pos;
fgetpos(fp,&pos);
fsetpos(fp,&pos);
之后,運(yùn)行程序,果真可以解決問(wèn)題。
C語(yǔ)言的標(biāo)準(zhǔn)I/O庫(kù)函數(shù)由于使用緩存的原因,在使用時(shí)可能出現(xiàn)各種各樣的問(wèn)題,尤其是在那種即時(shí)性比較強(qiáng)的I/O中,使用時(shí)要慎重。盡量使用其他的I/O函數(shù)代替之。