0

我在读取相机参数文件时遇到了 fscanf 函数的问题。我正在使用 QT 4.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 
4

2 回答 2

0

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

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;
}
于 2013-02-19T20:27:32.897 回答
0

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

Parametry_wewnętrzne_kamery
Focal_Length:
fc
=

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

于 2013-02-18T19:48:23.590 回答