File io fscanf QT小部件C++;

File io fscanf QT小部件C++;,file-io,scanf,File Io,Scanf,我在读取相机参数文件时遇到了fscanf函数的问题。我正在使用Qt4.7,编写QT小部件应用程序。我在执行第一个fscanf语句时遇到分段错误。但当我在控制台应用程序项目中执行代码时,它运行良好 以下是我的部分代码: struct parametry_kamery { float cc[2],fc[2],alpha_c,kc[5]; int D,al; }; parametry_kamery ka

我在读取相机参数文件时遇到了fscanf函数的问题。我正在使用Qt4.7,编写QT小部件应用程序。我在执行第一个fscanf语句时遇到分段错误。但当我在控制台应用程序项目中执行代码时,它运行良好

以下是我的部分代码:

struct parametry_kamery
           {
            float cc[2],fc[2],alpha_c,kc[5];
            int D,al;
           };
    parametry_kamery kam_par;

void Widget::readParameters(parametry_kamery* kam_par)
{

 FILE *fi;
 char buf[255];
 float cc1=0,cc2=0;

 fi=fopen("Camera parameters.cfg", "r");

 if(!fi)
 {
  QMessageBox::information(this,tr("Can't read file"),tr("Error"));
  return;
 }

 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %f %f",buf,buf,buf,&cc1,&cc2);

kam_par->fc[0] = cc1;
kam_par->fc[1] = cc2;

 fclose(fi);
}
我调用函数readParameters(&kam_par)

以下是文件的内容:

Parametry_wewnętrzne_kamery
Focal_Length:                    fc =  1079.33793   1181.44679  ± [ 2.44878   2.52105]
Principal_point:                 cc =  378.95649   245.99109  ± [ 3.48032   2.99878 ]
Skew:                       alpha_c =  0.00000  ±  0.00000     => angle of pixel axes = 90.00000 ± 0.00000 degrees
Distortion:                      kc =  -0.13666   -0.01830   -0.00070   0.00134  0.00000 

您的第一个fscanf是读取3个字符串,然后读取2个浮点。但是您的文件似乎在2个浮动之前以4个字符串开头。前4个字符串是:

Parametry_wewnętrzne_kamery
焦距:
足球俱乐部
=

顺便说一句,当您使用Qt时,使用Qt的文件函数(QFile和QTextStream)和QString及其转换函数将更容易(也不容易出错)。

我更改了函数,现在它采用了按值结构和返回结构,我知道它需要更多内存,但目前运行良好。我将尝试用指针修复该版本。 非常感谢你的帮助罗库

Widget::parametry_kamery Widget::readParameters(parametry_kamery kam_par)
{

 FILE *fi;
 char buf[255];

 fi=fopen("Camera parameters.cfg", "r");

 if(!fi)
 {
  QMessageBox::information(this,tr("Błąd odczytu pliku konfiguracyjnego"),tr("Error"));
  return parametry_kamery::parametry_kamery();
 }

 while('\n'!=fgetc(fi));

 fscanf(fi,"%s %s %s %f %f",buf,buf,buf,&kam_par.fc[0],&kam_par.fc[1]);

QMessageBox::information(this,buf,buf2);
 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %f %f",buf,buf,buf,&kam_par.cc[0],&kam_par.cc[1]);

 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %f",buf,buf,buf,&kam_par.alpha_c);

 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %f %f %f %f %f",buf,buf,buf,&kam_par.kc[0],
       &kam_par.kc[1],&kam_par.kc[2],&kam_par.kc[3],&kam_par.kc[4]);

 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %i",buf,buf,buf,&kam_par.D);

 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %i",buf,buf,buf,&kam_par.al);

 fclose(fi);
 return kam_par;
}

但为什么在控制台应用程序中,这种方法效果很好呢?我又添加了一个字符串,并在buf中使用了float,所以它不起作用。我忘了我有警告:格式“%s”要求类型为“char*”,但参数3的类型为“char(*)[250]”我在QT中是新手,没有找到像fscanf给meAh那样简单的方法来获取这些浮点值,这可能是实际的问题。您应该将
buf
作为一个参数,而不是
&buf
。删除它后,我没有警告,但仍然会出现分段错误。请将问题分解为更小的部分。首先只读取一个参数并打印它。当这起作用时,添加第二个参数,然后添加第三个参数,依此类推,直到找到问题所在。