4

我正在使用以下代码将文件读入字符数组。现在,对于小文件(比如 2 MB),它可以正常执行,但对于大文件(140 MB),在我的 18 GB UBUNTU 服务器中,它提供segmentation fault. 谁能帮我解决这个问题?我认为 18 GB 足以将 240 MB 文件保存到内存中。我正在使用 64 位 UBUNTU 并使用 g++ 进行编译。

ifstream is;

char chararray [fileSize] ;

is.read(chararray, fileSize) ;
4

3 回答 3

5

如果数组是局部变量,则会出现堆栈溢出,因为它不适合堆栈。而是在堆上分配“数组”,直接使用new或间接使用std::vector

或者使用内存映射。见mmap功能。

于 2012-11-20T10:18:16.177 回答
2

我不会在堆栈上分配 char 数组,而是尝试使用std::vector,它将在堆上动态分配:

std::vector<char> buffer(fileSize);
is.read(&buffer[0], fileSize);
于 2012-11-20T10:17:01.027 回答
1

GCC 编译器为此提供了名为 size 的默认命令!使用 GCC 编译器编译程序。然后你可以得到文件大小!

gcc -Wall test.c
size

这是一个普通的C程序!由于您没有指定任何参数,因此它将 ./a.out 作为其默认参数!

如果您必须应用一些优化,代码将如下所示..

praveenvinny@ubuntu:~/Project/New$> gcc -Wall -o1 -fauto-inc-dec test.c -o Output
praveenvinny@ubuntu:~/Project/New$> size output
text       data     bss     dec     hex filename
1067       256      8       1331    533 output

使用文本部分作为代码大小。如果还想考虑全局数据大小,可以使用 data 和 bss。

这将打印代码大小,

time -f "%e" -o Output.log ./a.out

将执行时间打印到名为 Output.log 的日志文件中

于 2012-11-21T19:06:21.100 回答