C語言檔案處理所遇到的一些問題和解決方法

2021-09-22 02:01:16 字數 3176 閱讀 8541

1.關與remove

remove用法:remove(「檔名」);

作用:刪除某檔案

注意:用這個函式時一定要先關閉檔案,再刪除,否則就會刪除失敗。

例如:先刪除檔案再關閉檔案就會刪除失敗

file *fp;

if((fp=fopen("檔案5","ab"))==null)

remove("檔案5"); //先刪除

fclose(fp); //後關閉

執行後:檔案仍然存在,刪除失敗

先關閉檔案再刪除才能刪除成功

file *fp;

if((fp=fopen("檔案5","ab"))==null)

fclose(fp); //先關閉

remove("檔案5"); //後刪除

2:關於rename

rename用法:rename(「原檔名」,「新檔名」);

作用:修改某檔案的名稱

注意:這個和remove類似,都要先關閉檔案,再刪除。

例如:先改名後關閉檔案

file *fp;

if((fp=fopen("檔案5","ab"))==null)

rename("檔案5","檔案567");//先改名

fclose(fp); //後關閉檔案

如果先關閉檔案再改名

file *fp;

if((fp=fopen("檔案5","ab"))==null)

fclose(fp); //先關閉檔案

rename("檔案5","檔案567");//後改名

在呼叫函式時,如果被呼叫函式裡面用到了remove和rename,一定要在呼叫函式前關閉檔案,否則操作就會失敗,因為這個錯誤不明顯,不是很好找,之前有一次我找了半天才知道是這個問題,在這提醒大家一下。

例如:

void handle()

fclose(fq);//先關閉檔案

remove("檔案5");//再刪除檔案

}int main()

handle();//先呼叫函式,在呼叫函式前沒有關閉檔案

fclose(fp);

return 0;

}

大家注意:handle函式這段**看似正確,但因為我們在main函式中並沒有在呼叫handle函式前關閉檔案,所以最中會導致刪除失敗。結果如下:

檔案仍然存在,刪除失敗。

也就是說,指向同乙個檔案的指標可以有多個,但只要有乙個指標還指向這個檔案,那麼該檔案用remove函式刪除就會刪除失敗。上面這個例子就是因為在呼叫handle函式前沒有關閉檔案,所以在handle函式裡面即使執行了fclose(fq)這一語句,但在main函式中的fp還是指向該檔案。也就是說還有指標指向待刪除的檔案。最終導致刪除失敗。

我們只要將main函式中的handle()和fclose(fp)交換下位置就可以了。我們看**:

void handle()

fclose(fq);//先關閉檔案

remove("檔案5");//再刪除檔案

}int main()

fclose(fp);//先關閉檔案

handle();//後呼叫函式

return 0;

}

執行後:

檔案刪除成功。

*3.還是在呼叫函式前不關閉檔案的一些問題

我們看下面這段**:

void handle()

fread(b,sizeof(b),1,fq);

puts(b);

fclose(fq);

}int main()

fwrite(a,sizeof(a),1,fp);

handle();

fclose(fp);

return 0;

}

執行結果如下

我們期待的結果應該是陣列a的內容"1234",但最終顯示的卻是亂碼。

這是因為雖然我們在main函式中將陣列a的內容存到檔案中,但此時我們沒有關閉檔案,陣列a的內容並沒有正真傳到檔案中,它還在緩衝區內。所有我們在執行handle函式時陣列b獲取的並不是陣列a的內容(檔案之前沒有任何內容)

所以我們還是得在執行handle前關閉檔案,讓在緩衝區中的內容到檔案中去,也就是交換下面這兩行**的順序。

handle();

fclose(fp);

交換後的結果如下:

現在就正確了。

*4.在用wb+,wa+,wr+這類既能讀也能寫的開啟方式時,盡量不要同時用fread和fwrite。如下:

file *fp;

char a[5]="1234",b[5];

if((fp=fopen("檔案5","ab+"))==null)

fread(b,sizeof(b),,fp);

fwrite(a,sizeof(a),1,fp);

flcose(fp);

我們想先從檔案讀取資料到陣列b中,然後再將a中的內容寫入檔案。但這樣我們並不能達到我們的目的,不信你可是試試。

但在fread和fwrite增加一些清空快取區函式或者檔案定位函式,就能同時讀之後接著寫。例如fseek,rewind。

fread(b,sizeof(b),,fp);

fseek(fp,0,1);

fwrite(a,sizeof(a),1,fp);

這樣就可以了。

這其中原因我也不清楚,只是在這裡提醒大家一下。··

希望能幫到大家!

今天所遇到的一些問題

今天我繼續前兩天的抓包任務,剛開始遇到了url中出現中文的問題,我不知道如何去解決,於是問了一下同組的師兄,他告訴我說把中文的編碼給變一下,於是我就去將文字的編碼給改變了,通過網上的文字編碼轉換器把文字的編碼給換了一下,結果還是不行。於是他就告訴我讓他先試試 最後他終於解出來了,用php直接把中文的...

antD vue 遇到的一些問題處理

1.maxlength 50 v decorator realname initialvalue info.realname invalid prop type check failed for prop maxlength expected number with value 50,got str...

編寫C語言遇到的一些問題5

1.在windows 下 vs2013中除錯帶引數的程式時,在屬性頁 配置屬性 除錯 命令引數中新增除錯需要帶的引數 2.假設我們的工程在my yolov3資料夾下,且程式中有讀文字檔案的操作,假設用debug編譯的,當執行程式時,需要把文字檔案放置在my yolov3 debug資料夾下 當除錯該...