處理數據最常用的函式就是開檔讀檔了
但開檔程式沒寫好,很容易讓程式線入死胡同喔
昨天就遇到這個問題
怎麼前天可以跑的程式,到了今天全變樣了,突然跑不了我也懵了
程式突然跳掉,建置也沒發生錯誤
Debug上說程式已返回碼1結束
我就想是不是檔案問題
因此中斷在開檔部分,發現檔案ptr錯誤,如下圖
錯在_ptr、_base、_tmpfname這三個地方,上網查了資料
根據我錯的地方,應該就是找不到下一個字元位置,與緩衝位置
簡單來說就是在我檔案位置路徑沒錯的情況下,莫名沒讀到檔案
http://hi.baidu.com/fcckinganimal/item/2eaa20a885aa3610a8cfb785
tyoedef struct _iobuf{
char *_ptr; /*next character position */
int _cnt; /*number of character left */
char *_base; /*location of buffer */
int _flag; /*mode of file access */
int _fd; /* file descriotor */
}FILE;
但也僅知道檔案沒讀到,因此回到原點,錯誤碼是什麼呢?
CXX0030 錯誤;無法評估運算式
這就算去VC2010官方找解決辦法,還是無法解決,因為官方也講得不清不楚
→您可能會希望重新撰寫運算式,並利用括號控制評估的順序。
我實在不太懂,這時我想到或許我再重組檔案字元時也有問題吧?
網路上找到很多跟讀檔EOF這個有關係相關資料
因此我更改我的程式碼
while(!feof(file)){}
while(c=getc(file)!=EOF)){}
但這不僅沒用,還漏讀了資料,後來我發現這僅會影響到讀取資料正確與否
跟我程式突然跳掉似乎沒太大關係...
另一點,在下寫讀檔有個習慣
當我要讀檔存入二元陣列時我會
while(!feof(file)){
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
fscanf(file,"%d",&a[i][j];
}
}
}
老實說我不知道這樣會不會造成程式crash掉,一次可能不算什麼
但如果好幾千次呢,我也不太清楚。
因此後來我改成
int i=0,j=0;
while(!feof(file)){
fscanf(file,"%d",&a[i][j];
if(j<5) j++;
else {
j=0; i++;
}
}
最後一點,我也習慣宣告一個FILE之後,開始對它瘋狂存取
但我會記得關就是了。簡單來說就是這個程式我可能需要開檔個20次
當然不是同時,因此在程式一開始宣告FILE *file
後面幾乎都是 file=fopen(); 反正檔名不同開得不是同一個檔案或許就沒事
但我可能想得太簡單了,之後錯誤都是在fopen那邊發生的...
因此後來我將我所要開的檔案作個分類,宣告不同的FILE去存取它。
後來我不僅新建專案,程式碼也整理過一次,才結束這場噩夢...
留言列表