2009-08-25 188 views
1
char *loadTextFile(const char *filename) 
{ 
    FILE *fileh; 
    char *text = 0; 
    long filelength; 
    if((fileh=fopen(filename,"rb"))== 0) 
     printf("loadTextFile() - could not open file"); 
    else 
    { 
     fseek(fileh, 0, SEEK_END); 
     filelength = ftell(fileh); 
     rewind(fileh); 
     text=(char *) smartmalloc((int)filelength + 1); 
     fread(text,(int)filelength, 1, fileh); 
     fclose(fileh); 
     text[filelength]=0; 
    } 
    printf(text); 
    return(text); 
} 

該函數只返回txt文件的部分數據。這也是不一致的...... soemtimes給我100次文件的一些字符20次。我沒有看到任何錯誤。以爲我可能會得到另一雙眼睛。謝謝。C的文件輸入/輸出功能

+1

你忘了把你的問題作爲一個問題來制定。如果你明確表達你期望的答案,那麼它可能會有所幫助,也許在某個地方會有審問標記。 – Juliano 2009-08-25 17:32:25

+0

我看到一些問題。例如,沒有標準的'C'函數叫做'smartmalloc'。我會發佈一個修訂版本。 – 2009-08-25 17:32:56

+0

這是一個cgi-html庫函數 – 2009-08-25 17:37:26

回答

3

這是一個稍微更好的代碼版本。您需要使用IO函數調用進行更多的錯誤檢查。另外,還有一個令人討厭的longsize_t隱式轉換,我建議在生產代碼中正確處理。

char* loadTextFile(const char *filename) { 
    char *text; 
    long length; 

    FILE *fileh = fopen(filename, "rb"); 
    if (!fileh) { 
     return NULL; 
    } 

    fseek(fileh, 0, SEEK_END); 
    length = ftell(fileh); 
    rewind(fileh); 

    text = malloc(length + 1); 

    if (!text) { 
     return NULL; 
    } 

    fread(text, 1, length, fileh); 
    text[length] = 0; 

    fclose(fileh); 

    return text; 
} 

需要注意的是,John R. Strohm是正確的:如果你的東西已經被閱讀的評估是基於什麼printf打印,那麼你很可能被嵌入nul小號誤導。

+0

謝謝,我明白這一點。去看看我能否先弄清楚這個不好的功能。 – 2009-08-25 18:17:41

+0

看起來我誤導了printf和調試器。 當我顯示返回的數據在它的最終目的地(網頁)時,它顯示全部。不知道爲什麼我在調試器中看不到它。 – 2009-08-25 18:46:19

+0

@Tommy因爲任何嵌入的'nul's告訴'printf'和調試器字符串的結尾。 – 2009-08-25 18:58:27

4

明顯的事情來檢查:

什麼FTELL(fileh)給你?

文件中是否可以嵌入NUL字符?這會導致printf(文本)過早停止。

+0

看起來像是正確的字符數量2705 是的,可能有,但我被拋棄,因爲我得到不同的地方它終止,這並不一致。 – 2009-08-25 18:03:56

+0

調試器中的字符串也被縮短..... – 2009-08-25 18:11:57

+0

這是一個指示符,表示您的文件中有NULL。替換最後一個printf爲 fwrite(text,1,length,stdout); 並告訴結果 – Massa 2009-08-25 18:46:06

3

fread不能保證返回儘可能多的字符,因爲您要求的是。你需要檢查它的返回值並在循環中使用它。

實施例環路(未測試):

char *p = text; 
do { 
    size_t n = fread(p,1,(size_t)filelength, fileh); 
    if (n == 0) { 
     *p = '\0'; 
     break; 
    } 
    filelength -= n; 
    p += n; 
} while (filelength > 0); 

測試爲n==0漁獲其中一些其它過程截斷該文件作爲你正在試圖讀取它的情況。