2012-08-04 36 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

相关问题