我在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;
}
答案 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);
}
}
}
答案 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变量的未初始化内容,当然不会改变。