【发布时间】:2011-01-03 00:00:33
【问题描述】:
我正在处理我想在处理它们时读入缓冲区的小文本文件,所以我想出了以下代码:
...
char source[1000000];
FILE *fp = fopen("TheFile.txt", "r");
if(fp != NULL)
{
while((symbol = getc(fp)) != EOF)
{
strcat(source, &symbol);
}
fclose(fp);
}
...
这是将文件内容放入缓冲区的正确方法还是我在滥用strcat()?
然后我这样遍历缓冲区:
for(int x = 0; (c = source[x]) != '\0'; x++)
{
//Process chars
}
【问题讨论】:
-
这是错误的。
strcat连接字符串。即使&symbol是char *,它也不是空终止的。您应该使用fgets或fread。此外,strcat在您的情况下无论如何都会很慢,因为它每次需要附加一个字符时都会扫描source。 -
更不用说一次读取一个字符会比使用
fread慢得多。 -
@Nick:我不知道“慢得多”:由于 io 缓冲和可能的函数调用内联,性能影响不一定要那么大;不过,使用
fread()仍然是个好主意 -
顺便说一句:我不会认为 1m 的文本文件“小”;)
-
查看 mmap() 以内存映射文件。注意缓冲区溢出。不要使用 strcat() - 即使你解决了空终止的问题,它也会给你带来二次行为,这对兆字节文件是不好的,对千兆字节文件是灾难。