读取充满数字的文件时获取零

时间:2013-07-31 13:27:14

标签: c++

我正在尝试读取一个有几百行的文件。每一行看起来大致如此(请记住,这些不是实际的数字。只是格式的一个样本。)     R 111.1111 222.2222 123456 11 50.111 51.111

我尝试用fscanf读取这个文件然后打印出一些值,但是当我打印出值时,我得到的所有变量都是0。我已检查过该文件,并且所有变量的所有行都没有值为0。我是用C ++写的。

#include <fstream> 
#include <iostream> 
#include <string>

using namespace std;

int main(int argc, char** argv)
 {
  FILE *myfile;
  myfile = fopen("tmp.txt", "r");

  string type;
  float dx;
  float dy;
  float intensity;
  int nsat;
  float rmsy;
  float rmsx;

  if (myfile == NULL) exit(1);

  else
    {
      while ( ! feof (myfile) )
       {
      fscanf(myfile,"%s %f %f %f %i %f %f\n",&type, &dx, &dy, &intensity, &nsat, &rmsx, &rmsy);
      printf("F %f %f %f %i %f %f\n", dx, dy, intensity, nsat, rmsx, rmsy);

       }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用std::ifstream

执行此操作

注意此代码假设输入文件格式良好且一个规则上没有值

#include <fstream> //for ifstream
#include <string> //for strings

ifstream stream ( "tmp.txt", ios::in );
string type;
float dx;
float dy;
float intensity;
int nsat;
float rmsy;
float rmsx;

while ( stream >> type){
    stream >> dx;
    stream >> dy;
    stream >> intensity;
    stream >> rmsy;
    stream >> rmsx;

    cout << type << '\t'
        << dx << '\t'
        << dy << '\t'
        << intensity <<'\t'
        << rmsy << '\t'
        << rmsx << endl;
}

并使用input.txt =

 R 111.1111 222.2222 123456 11 50.111
 T 111.1111 222.2222 123456 11 50.111

这再打印出来,注意这是更惯用的C ++。

输出=

R   111.111 222.222 123456  11  50.111
T   111.111 222.222 123456  11  50.111

答案 1 :(得分:0)

您的代码存在多个问题,但是:

问题是格式字符串开头的%s%s匹配整行,因此包含所有值。

也许您可以使用%c代替,如果您确定,数字前只有一个字符。

另请注意,您已将std::string - 指针传递给scanf。这是无效的,因为scanf需要char缓冲区来存储字符串(%s),这根本不是一个好主意,因为您不知道所需的缓冲区长度

这对我有用:

#include <fstream> 
#include <iostream> 
#include <string>

using namespace std;

int main(int argc, char** argv)
{
  FILE *myfile;
  myfile = fopen("tmp.txt", "r");

  char type;
  float dx;
  float dy;
  float intensity;
  int nsat;
  float rmsy;
  float rmsx;

  // The NULL-if should be here, but left out for shortness
  while ( ! feof (myfile) )
  {
    fscanf(myfile,"%c %f %f %f %i %f %f",&type, &dx, &dy, &intensity, &nsat, &rmsx, &rmsy);
    printf("F %f %f %f %i %f %f\n", dx, dy, intensity, nsat, rmsx, rmsy);
  }
}