c語言程式中的疑惑關於檔案的),C語言程式中的疑惑 (關於檔案的)

時間 2021-12-27 18:47:11

1樓:匿名使用者

已經傳送。主要查收。這個主要是這個問題。不難的

2樓:

不行!仔細研讀msdn可以知道:

fseek操作會改變檔案結尾標誌,就是說,如果檔案指標剛好在檔案尾部,這時候進行fseek操作,哪怕是在結尾向前移動也會使檔案結尾標誌後移,從而使後面的feof()判斷檔案是否結尾失效,進入死迴圈,直到空間耗盡.

避免的辦法就是,利用連續兩個fread來測試feof,避免fseek出現在檔案尾部而再判斷檔案是否結束的情況出現.

有點繞,不知道我說清楚了沒有.

有什麼問題,可以再深入交流.

3樓:

產生這個問題的主要原因不是因為fseek和fread

而是因為讀寫交替而緩衝區沒有及時重新整理造成的,一般發生在使用rb+邊讀邊讀寫的模式時,因為對檔案的操作其實都是在緩衝區裡進行的。

當用rb+開啟時,如果是先進行寫檔案,則由於原檔案裡的內容沒有讀到緩衝區的.所以如果進行讀操作的時候檔案指標在緩衝區的末尾(不是檔案末尾),此時讀取的資料就會出錯。

當先讀取檔案時,會將檔案內容讀入緩衝,此時的寫操作是對緩衝進行操作,只有在遇到對檔案指標的操作(如fseek,rewind,fopen,fclose)時才會把緩衝裡的內容寫進檔案,然後再根據緊接著的第一條語句是讀還是寫檔案決定是否把檔案的內容讀入緩衝。在寫操作之後如果沒有重新整理緩衝區而進行寫操作,則會發生混亂,因為讀和寫操作共用了同一緩衝區而各自的指標不同步。

解決這種問題的方法是在有讀寫混用情況時,在讀和寫操作切換時重新整理緩衝。獨立的寫操作或者讀操作是絕對不會發生這種問題。

比較典型的,各種語言都有io操作,即輸入輸出操作,比如printf()只能做輸出操作,scanf()進行輸入操作,是不能混用的,因為輸入輸出對緩衝區都有著各自對緩衝區的管理方法。

下面分析你這個程式,當執行到stu.score=『a』時,此時一直都在讀操作,不會發生問題,當你

首先呼叫fseek移動檔案指標(重新整理緩衝,不會出現問題)然後呼叫fwrite時進行寫操作,此時後面兩條語句就是你說的多餘的語句,但是其中關鍵的一句是fseek,前面提到過,該函式會對緩衝區進行重新整理,因此如果去掉這兩句,write後面跟著的是read操作,則會發生混亂。

如果你想要驗證這種情況,也可以在開啟這個檔案之後,直接用write寫入第一條記錄,read讀取第二條記錄,你會發現read的結果是亂的。如果在read和write之間加入重新整理緩衝操作,則可以消除這個問題。

出於程式美觀,這種讓檔案指標退一步又進一步的操作,的確不大優雅,而且還讀取了多餘的資料,不過你可以選擇下面的方式代替之

1、fflush(fp) 重新整理

2、fseek(fp,0l,seek_cur); //移動到原地,實際上fseek操作內部隱含了乙個fflush操作。

這樣看起來是不是舒服多了?

關於c語言刑序很疑惑的地方,關於C語言小程式,乙個很疑惑的地方

c語言隱式轉換。參照ascii編碼表來進行轉換。輸入時,char int。你用 s進行輸出時,又會參照 ascii編碼,把數字轉換成相對應的字母或者其他標識。基本就這樣了。你可以這樣 int a 64 用 s 輸出,就是對應的字母。char a a 用 d輸出,就是相應的數字。不管是int還是cha...

關於c語言的區域性鞍點程式改錯,關於C語言的區域性鞍點程式改錯

龐綺琴 1.include stdio.h include conio.h include math.h void main int i,k,max,sub,temp printf 交換之前,輸出 n for i 0 i 5 i printf n for i 0 i 4 i temp a i i a...

關於C語言for的迴圈次數,C語言程式裡for迴圈1秒鐘大概迴圈多少次?

c語言的for迴圈的依次列印從一到十的數字,看看就會了 多於一行的迴圈體要用大括號 include void main printf sum is ld n sum printf 外迴圈的次數 d,內迴圈的次數 d n m,n 1.迴圈次數是4次 2.退出迴圈時a的值為61 3.j的值為11 inc...

關於c語言scanf中n的問題,關於C語言scanf中 n 的問題

我剛才用vs2008測試了一下,答案和你的一樣,估計是書錯了吧。個人認為scanf其實就是從乙個輸入佇列中取值,前面輸入的數字先被賦值。剛才查了一下,lz和我的結果一樣,應該是書上錯了在scanf裡 n 很特別的,不是要求輸入乙個回車換行引用一下別人的說法 過濾空格 製表符 回車等輸入,也就是說 s...

如何實現c語言中複製檔案的程式,如何實現C語言中複製檔案的程式

風若遠去何人留 1 以唯讀方式開啟第乙個檔案 2 以寫方式開啟第二個檔案 3 迴圈讀取字元,並寫入第二個檔案。直到遇到eof結束。4 關閉檔案。include int main 要是只複製乙個檔案的話,流程如下 1.開啟讀檔案,準備寫檔案 2.讀檔案到緩衝 3.將緩衝內容寫到寫檔案 4.如果所有內容...