2014-01-17 60 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