close

處理數據最常用的函式就是開檔讀檔了

但開檔程式沒寫好,很容易讓程式線入死胡同喔

昨天就遇到這個問題

怎麼前天可以跑的程式,到了今天全變樣了,突然跑不了我也懵了

程式突然跳掉,建置也沒發生錯誤

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;

錯誤ptr  

但也僅知道檔案沒讀到,因此回到原點,錯誤碼是什麼呢?

CXX0030 錯誤;無法評估運算式

這就算去VC2010官方找解決辦法,還是無法解決,因為官方也講得不清不楚

運算式評估工具錯誤 CXX0030

→您可能會希望重新撰寫運算式,並利用括號控制評估的順序。

我實在不太懂,這時我想到或許我再重組檔案字元時也有問題吧?

 

網路上找到很多跟讀檔EOF這個有關係相關資料

C 及 C++ 常犯錯誤 - EOF 測試的錯誤用法 

File I/O

因此我更改我的程式碼

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去存取它。

後來我不僅新建專案,程式碼也整理過一次,才結束這場噩夢...

arrow
arrow
    全站熱搜

    glitterHsin 發表在 痞客邦 留言(0) 人氣()