C++ 用C+读取文本文件+;

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

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

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