用C ++读取文本文件

时间:2012-01-09 21:48:36

标签: c++ c file-io

我在OpenCV上的Ubuntu工作。我试图读取包含数字的文本文件,但我不断获取垃圾值,每次函数循环时重复相同的值。 这是代码的一部分:

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;
}

5 个答案:

答案 0 :(得分: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 :(得分:2)

fgetc()从文件中读取一个字符。它等同于getc。您可以使用!feof(fid)作为您的条件。垃圾值是因为在从文件中读取浮点值时您不在正确的位置,因此,其他字符/特殊字符会影响C读取的值。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

的假设:

  • /trail文件每行只包含一个浮点值

说完上述内容后,您不需要while循环fgetc(),而是需要以下

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

}

答案 4 :(得分:0)

我的猜测是fopen失败了,所以fscanf失败了(没有读任何东西),你得到的垃圾值实际上是trainample变量的未初始化内容,当然不会改变。