2012-08-16 125 views
-1

不同我寫了下面的函數讀取文件的內存內容。 它在我的本地機器(Ubuntu 32bit)上運行良好,但在服務器(CentOS 64bit)上產生錯誤的結果。閱讀文件存儲器的內容,導致32位操作系統和64位操作系統

錯誤的情況下: 有了一個40字節的文件,內容是下面的64位操作系統,它給了我錯誤的結果。

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

代碼:

char* file_get_contents(const char *filename) { 
    FILE *stream = NULL; 
    char *content = NULL; 
    size_t ret; 
    struct stat st; 

    if ((stream = fopen(filename,"r")) == NULL) { 
    fprintf(stderr, "Failed to open file %s\n", filename); 
    exit(1002); 
    } 

    if(stat(filename, &st) < 0) { 
    fprintf(stderr, "Failed to stat file %s\n", filename); 
    exit(1002); 
    } 

    content = malloc(st.st_size); 
    ret = fread(content, 1, st.st_size, stream); 

    if (ret != st.st_size) { 
    fprintf(stderr, "Failed to read file %s\n", filename); 
    exit(1002); 
    } 

    fclose(stream); 
    return content; 
} 
+2

什麼是錯的輸出?用'\ 0''終止了「內容」嗎? – Rohan 2012-08-16 09:35:55

+0

@Rohan是的,錯誤的結果不會被終止。但爲什麼它在32位操作系統中運行良好? – xdazz 2012-08-16 09:38:05

+0

@xdazz大多運氣,也許正好是在一塊的malloc()給你之後,存儲一個零字節,而內存包含您的其他平臺上的其他東西。 – nos 2012-08-16 09:39:40

回答

3

file_get_contents不能正確使用它的調用者。它返回一個char *,但不是它的長度,也不返回一個字符串(即它不是null結尾)。

只要你正在閱讀的文字,例如做

content = malloc(st.st_size + 1); // + 1 here for the nul terminator 
    ret = fread(content, 1, st.st_size, stream); 

    if (ret != st.st_size) { 
    fprintf(stderr, "Failed to read file %s\n", filename); 
    exit(1002); 
    } 
    content[st.st_size] = 0; //nul terminate 
+0

該文件有39了''和'st.st_size'是'40',字符串的長度應該是39,爲什麼我需要'+ 1'? – xdazz 2012-08-16 09:40:10

+0

@xdazz你忘了\ n – CyberDem0n 2012-08-16 09:41:47

+0

@ Cyber​​Dem0n但文件中沒有'\ N'。 – xdazz 2012-08-16 09:43:02

相關問題