2014-01-17 63 views
0

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

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

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

在那之后,我是否长度是大于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使用它的长度,它工作得很好。也许如果使用读取与长度大于文件的大小使其无法正常工作?

非常感谢

+0

这与'c'有什么关系? – luk32

+0

哎呀抱歉...我盲目地按下建议的c标签.... – user2455103

+1

[不要迭代'eof()'](http://stackoverflow.com/questions/5605125/why-is-iostreameof - 内部-A-循环条件考虑的,是错误的)。这会导致您的重复上次输出。 – Angew

回答

2

您的字符串不以NULL结尾。 read()函数不会将'\0'放在它为您读取的内容的末尾,因此当您打印它时,基本上是在您读取的内容结束时打印垃圾数据,因为打印代码需要NULL结束符标记字符串的结尾。

+0

感谢您的回答......好吧,我通过在缓冲区[长度]处添加'\ 0'来测试您所说的内容,但实际上并没有发生任何事情。 – user2455103

+0

@ user2455103缓冲区是否足够容纳额外的''\ 0''? (它必须比你读的数量大1个字节。)另外,你并没有检查read()的返回值来查看实际读取的字节数。不要认为它的读数与你要求的一样多(特别是如果你要求的文件大小超过文件大小)。 – TypeIA

+0

哦,是的......你说得对!通过使用gcount(),并只打印读取字符的数量,输出是干净的,很好! +1 – user2455103