2012-01-09 186 views
-1

我在OpenCV上的Ubuntu上工作。我正在嘗試讀取包含數字的文本文件,但我不斷收到垃圾值,並且每次函數循環時都會重複相同的值。 下面是代碼的一部分:閱讀C++中的文本文件

FILE* fid = fopen("/trial","r"); 
while (fgetc(fid) != EOF) 
{ 
    fscanf(fid, "%f", &trainsample); 
    cout << trainsample << endl; 
    cvSetReal2D(traindata, i, j, trainsample); 
    j = j + 1; 
    if (j == 6) 
     i = i + 1; 
} 
+1

你對'fgetc()'的返回值做了什麼? – 2012-01-09 21:50:11

+0

你用'fscanf()'的返回值做什麼?也許你的一些輸入數據不能放入'float'中。 – 2012-01-09 21:54:36

+0

該文本文件具有由空格分隔的所有浮點數和整數。 – SB26 2012-01-09 22:10:57

回答

4

爲什麼不使用C++ ifstream來執行此任務?

#include <iostream> 
#include <fstream> 

int main(){ 
    std::ifstream fileStream("/trail"); 
    double trainsample; 
    if(!fileStream.good()){ 
     std::cerr << "Could not open file." << std::endl; 
     return 1; 
    } 
    while(fileStream >> trainsample){   
     std::cout << trainsample << std::endl; 
    } 
    if(fileStream.fail()) 
     std::cerr << "Input file stream error bit is set, possible read error on file." << std::endl;    
} 

如果你喜歡C文件處理嘗試

#include <cstdio> 

int main(){ 
    FILE *fid = fopen("/trail","r"); 
    double trainsample; 
    if(fid){ 
     while(!feof(fid)){ 
      fscanf(fid,"%lf",&trainsample); // Please notice "lf" when using double. Using "f" will result garbage. 
      printf("%lf\n",trainsample); 
     } 
    } 
} 

又見cstdioifstream

+1

'while(fileStream.good())'不是要走的路。它通常會迭代太多次。正確的方法是將提取語句放入條件中。 – jrok 2012-01-09 22:44:30

+0

@jrok:啊,我明白了。沒有注意到'std :: istream :: operator >>'返回'(* this)'。謝謝! – Zeta 2012-01-09 22:54:25

+0

它的工作原理是逐行讀取文件。如果我的文件在每行中有一個數字,ifstream將逐個讀取這些數字。有沒有辦法一次讀取所有數字? – Ruchir 2015-08-14 08:21:57

2

龜etc()從文件中讀取的字符。它相當於getc。相反,您可以使用!feof(fid)作爲條件。垃圾值是因爲你不是在正確的位置,同時從文件讀取,因此,其它字符/特殊字符浮動值影響的值由C.

+0

給出一些進一步的思考,你的文本文件中的值是如何分開的?如果用空格或製表符逗號分隔,則可能需要讀入其他字符/字符串! – Neo 2012-01-09 21:54:09

+1

他可能應該**不**使用'!feof(fid)'作爲循環條件,因爲它不會被設置,直到他試圖讀取... – 2012-01-09 21:55:28

+0

嗯..我不知道@EvanTeran。我之前成功運行過類似的循環。 – Neo 2012-01-09 21:59:46

0

ASSUMPTION正在閱讀:

  • /trail文件每行僅包含一個浮點值

說了上面的,你不需要while循環與fgetc(),而不是你需要以下

while (fscanf(fid,"%f",&trainsample) == 1) { 
    cout<<trainsample<<endl; 
    /* you can put all you logic here */ 

} 
+0

嗯,我試過你的解決方案,但它不起作用 – SB26 2012-01-09 22:09:49

+0

@ SB26你可以做一個'貓蹤跡',並告訴我們什麼是存儲在該文件?這會給我們一些關於如何閱讀它們的暗示。 OTOH,是你的'fopen()'成功返回一個有效的'FILE'描述符?! – 2012-01-09 22:12:16

0

我的猜測是fopen失敗,所以fscanf失敗(不讀取任何內容),並且垃圾值實際上是trainsample變量的未初始化內容,這當然不會改變。

2

是否有任何特別的原因,你使用C風格的I/O例程,而不是C++流操作符?

#include <iostream> 
#include <stdexcept> 
#include <fstream> 
... 
std::ifstream fid("/train"); 
if (!fid.good()) 
    // could not open file, panic here 
else 
{ 
    float trainsample; 
    while (fid >> trainsample) 
    { 
    std::cout << trainsample << std::endl; 
    ... 
    } 
    if (fid.eof()) 
    std::cout << "Hit end of file" << std::endl; 
    else if (fid.fail()) 
    std::cout << "Read error on file" << std::endl; 
}