C++ 用C+读取文本文件+;
我在Ubuntu的OpenCV上工作。我试图读取一个包含数字的文本文件,但我不断获取垃圾值,并且每次函数循环时都会重复相同的值。 以下是该部分代码:C++ 用C+读取文本文件+;,c++,c,file-io,C++,C,File Io,我在Ubuntu的OpenCV上工作。我试图读取一个包含数字的文本文件,但我不断获取垃圾值,并且每次函数循环时都会重复相同的值。 以下是该部分代码: FILE* fid = fopen("/trial","r"); while (fgetc(fid) != EOF) { fscanf(fid, "%f", &trainsample); cout << trainsample << endl; cvSetReal2D(traindata, i
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;
}
FILE*fid=fopen(“/trial”,“r”);
while(fgetc(fid)!=EOF)
{
fscanf(fid、%f、&trainsample);
coutfgetc()从文件中读取字符。它相当于getc。您可以使用!feof(fid)作为您的条件。垃圾值是因为您在从文件读取浮点值时未处于正确位置,因此,其他字符/特殊字符会影响C读取的值。假设:
/trail
文件每行仅包含一个浮点值
如上所述,您不需要使用while
循环fgetc()
,而是需要以下内容
while (fscanf(fid,"%f",&trainsample) == 1) {
cout<<trainsample<<endl;
/* you can put all you logic here */
}
while(fscanf(fid),%f,&trainsample)==1){
我猜FFACT是失败的,所以FSCANF失败了(没有读到任何东西),而你得到的垃圾值实际上是训练样本变量的未初始化内容,当然不会改变。 < P>为什么不使用C++ <代码> IFSturi>代码>这个任务?< /P>
#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;
}
#包括
#包括
int main(){
std::ifstream fileStream(“/trail”);
双样本;
如果(!fileStream.good()){
标准::cerr列车样本{
STD::CUT有没有特殊的原因,你使用C风格I/O例程来代替C++流操作符?< /P>
#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;
}
#包括
#包括
#包括
...
std::ifstream fid(“/列车”);
如果(!fid.good())
//无法打开文件,此处出现恐慌
其他的
{
浮样;
同时(fid>>列车样本)
{
std::cout您对fgetc()
的返回值做什么?您对fscanf()的返回值做什么
?可能您的一些输入数据无法放入到浮点数中
。文本文件中的所有浮点数和整数都用空格分隔。进一步考虑一下,文本文件中的值是如何分隔的?如果它们是空格制表符或逗号分隔的,您可能需要读取额外的字符/字符串!他可能不应该使用!feof(fid)
作为循环条件,因为它在他尝试读取之后才被设置……嗯……我不知道@EvanTeran。我以前成功地运行过类似的循环。我想我理解你的意思。如果我的文件为空,会发生什么?请告诉我这是否正确:如果文件不是空的,并且至少包含一个值,则feof()将返回false,控件将进入循环。对文件的后续读取/操作将确保在正确的时间标记EOF。但如果我的文件为空,则将返回feof()第一次尝试失败?这就是你想要指出的吗?它由空格分隔。文件中的所有值都是数字,有些是浮点数,有些是浮点数integers@SB26你能做一个cat trail
并告诉我们该文件中存储了什么吗?!这会给我们一些关于如何读取它们的提示。OTOH,你的fopen()是什么
成功返回有效的文件
描述符?!而(fileStream.good())
不是一个好方法。它通常会重复太多次。正确的方法是将提取语句置于条件中。@jrok:啊,我明白了。没有注意到std::istream::operator>
返回(*此)
。谢谢!它可以工作,但可以逐行读取文件。如果我的文件每行有一个数字,那么ifstream将逐个读取这些数字。是否有一种方法可以一次读取所有数字?
#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;
}