Ifstream读取无用数据 我使用C++来读取块中的文件。 该文件包含整数,每行两个

Ifstream读取无用数据 我使用C++来读取块中的文件。 该文件包含整数,每行两个,c++,arrays,char,fstream,C++,Arrays,Char,Fstream,首先,我用这个来查找文件的长度: input.seekg (0, input.end); int length = input.tellg(); input.seekg (0, input.beg); 之后,我检查长度是否大于chunksize,如果这是真的,我为区块分配内存 char*buffer=新字符[chunksize] 好的,这里是阅读功能 while (true) { input.read (buffer,chunksize);

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

input.seekg (0, input.end);
int length = input.tellg();
input.seekg (0, input.beg);
之后,我检查长度是否大于chunksize,如果这是真的,我为区块分配内存

char*buffer=新字符[chunksize]

好的,这里是阅读功能

while (true)
        {
            input.read (buffer,chunksize);
            cout<<buffer;
            if(input.eof()) break;
        }
程序将不会输出预期的字符,但类似于:

2 5 
4 5 
6 8
7 5
4 2
1 2 2
1 2
你知道这些额外字符的原因吗?如果文件的大小小于chunksize,则我使用其长度input.read,它工作正常。如果使用长度大于文件大小的读取,可能会使其无法正常工作


非常感谢

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

这与
c
有什么关系?很抱歉。。。我盲目地按下了建议的c标签。。。。。这会导致您的上次输出重复。谢谢您。。。好吧,即使我对小于chunksize的文件进行循环和eof,垃圾数据仍然存在…读取不应该在eof停止吗???谢谢你的回答。。。好的,我通过在缓冲区[length]添加一个“\0”来测试你说的话,但实际上什么都没有发生。@user2455103的缓冲区
大到足以容纳额外的
“\0”
?(它必须比您正在读取的量大1字节。)此外,您没有检查
read()
的返回值以查看实际读取了多少字节。不要认为它的读取量和你要求的一样多(特别是如果你要求的文件大小还不止)。。。你是对的!!!通过使用gcount(),并且只打印读取字符的数量,输出是干净和漂亮的+1.
2 5 
4 5 
6 8
7 5
4 2
1 2 2
1 2