2012-08-04 60 views
0

如果我明確聲明緩衝區大小,我似乎只能將文件讀入內存。這工作將文件讀入內存?

#include <stdio.h> 
int main(){ 
    FILE *fp = fopen("test.log", "rb"); 
    char buffer[37]; 
    fread(buffer, 1, 36, fp); 
    printf("%s", buffer); 
} 

這將增加垃圾到輸出

#include <stdio.h> 
int main(){ 
    FILE *fp = fopen("test.log", "rb"); 
    fseek(fp, 0, SEEK_END); 
    long siz = ftell(fp); 
    rewind(fp); 
    char buffer[siz + 1]; 
    fread(buffer, 1, siz, fp); 
    printf("%s", buffer); 
} 
+2

概念錯誤。在C中,任何數組的聲明都應該指出在編譯時的大小。如果要動態創建數組,請使用'malloc' – texasbruce 2012-08-04 17:43:58

+0

以二進制模式打開文件,但將其打印爲字符串。這隻適用於數據確實是文本的情況。另外,您不會終止緩衝區。請記住,在創建數組時它不會自動清零。 – 2012-08-04 17:47:31

+0

也許無關緊要,因爲它不能確定數據的實際內容,你不是'NUL'終止你的字符串。嘗試在字符數組的末尾添加'\ 0'並查看它打印出來的內容。 – 2012-08-04 17:50:40

回答

7

插入buffer[siz]='\0';以前printf("%s", buffer);

+0

數組的終止應該在兩種情況下都應該完成。 OP的第一個版本運行真是幸運。 – 2012-08-05 06:48:18

+0

@JoachimPileborg:我也這麼認爲。 – BLUEPIXY 2012-08-05 08:19:56

+0

還有可能是編譯器而不是運氣。 – BLUEPIXY 2012-08-05 09:12:14

0

嘗試一種不同的方法 - 使用 「存儲器映射」。它所做的是允許您像訪問內存塊一樣訪問文件。這可以顯着提高性能,同時簡化代碼。

閱讀更多關於它在http://en.wikipedia.org/wiki/Mmap

+0

這不回答問題,並且沒有跡象表明這裏需要內存映射文件。這個問題具體問到如何「將文件讀入內存」,這不是你的答案。 「將文件讀入內存與」像處理內存中的文件一樣「有區別。」 – 2012-08-04 17:53:40

相關問題