File io fscanf QT小部件C++;
我在读取相机参数文件时遇到了fscanf函数的问题。我正在使用Qt4.7,编写QT小部件应用程序。我在执行第一个fscanf语句时遇到分段错误。但当我在控制台应用程序项目中执行代码时,它运行良好 以下是我的部分代码: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
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
。删除它后,我没有警告,但仍然会出现分段错误。请将问题分解为更小的部分。首先只读取一个参数并打印它。当这起作用时,添加第二个参数,然后添加第三个参数,依此类推,直到找到问题所在。