【问题标题】:Ifstream Read Useless DataIfstream 读取无用数据
【发布时间】:2025-12-25 08:00:06
【问题描述】:

我正在使用 C++ 分块读取文件。 该文件包含整数,每行两个。

首先,我用它来查找文件的长度:

input.seekg (0, input.end);
int length = input.tellg();
input.seekg (0, input.beg);

之后,我检查 length 是否大于 chunksize,如果是,我为该块分配内存...

char * buffer = new char [chunksize];

好的,阅读功能就到这里了……

while (true)
        {
            input.read (buffer,chunksize);
            cout<<buffer;
            if(input.eof()) break;
        }

紧接着我delete [] buffer;

但是,我遇到了此代码的问题。比如输入文件是这样的:

2 5 
4 5 
6 8
7 5
4 2
1 2

程序不会输出预期的字符,而是类似:

2 5 
4 5 
6 8
7 5
4 2
1 2 2
1 2

你知道这些额外字符的原因吗?如果文件的大小小于 chunksize,我 input.read 使用它的长度并且它工作得很好。也许如果使用长度大于文件大小的 read 使其无法正常工作?

非常感谢

【问题讨论】:

  • 这与c有什么关系?
  • 抱歉……我盲目地按下了建议的 c 标签……
  • Don't iterate on eof()。它会为您导致重复的最后输出。
  • 谢谢你...好吧,即使我为小于块大小的文件取出循环和eof,垃圾数据仍然存在......
  • 不应该在 eof 处停止读取吗???

标签: c++ arrays char fstream


【解决方案1】:

您的字符串不是以 NULL 结尾的。 read() 函数不会将 '\0' 放在它为您读取的内容的末尾,因此当您打印它时,您实际上是在打印超出您阅读内容末尾的垃圾数据,因为打印代码是期望 NULL 终止符来标记字符串的结尾。

【讨论】:

  • 感谢您的回答...好吧,我通过在缓冲区[长度]处添加一个“\0”来测试您所说的内容,但实际上,什么也没发生。
  • @user2455103 buffer 是否足够容纳额外的 '\0'? (它必须比您正在读取的数量大 1 个字节。)此外,您没有检查 read() 的返回值来查看实际读取了多少字节。不要假设它的阅读量与您要求的一样多(特别是如果您要求的超出文件的大小)。
  • 哦,是的...你是对的!!!通过使用 gcount(),只打印读取的字符数,输出干净漂亮!!! +1