【发布时间】:2016-03-04 03:35:51
【问题描述】:
我有一个问题,我必须从输入文件中读取大数据(8mb)。我尝试给出数组的大小。有什么有效的方法可以重写代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *f;
char msg[9000000]=" ";
int i=0;
f=fopen("file.txt","r");
while((msg[i]=fgetc(f))!=EOF){
i++;
}
printf("\nThe data from the file is :%s\n",msg);
fclose(f);
return 0;
}
【问题讨论】:
-
只是不要将它存储在堆栈上,而是使用堆分配的内存。见
malloc和free。 -
另请注意,虽然可移植性较差(POSIX 与 Windows 目标的不同 API),但当您尝试从文件中获取二进制数据时,内存映射通常很有帮助。在 Windows 上搜索
mmap(如果您使用 UNIX、Linux、BSD、OSX 等 POSIX 系统)或CreateFileMapping;尤其是在 64 位机器的时代,当您可以mmap文件并像访问延迟填充的数组一样访问它时,几乎没有理由更喜欢显式的文件读/写 API。 -
static char msg[9000000];是一个简单的解决方案 -
msg[i]=fgetc(f))!=EOF不正确(它要么永远不会触发,要么对某些字符给出误报)。您需要将fgetc的结果存储在int中并与EOF进行比较。此循环还应检查它是否不会溢出msg的范围。使用fread而不是循环将立即解决所有这些问题。