Sam*_*NLP 0 c++ qt fopen scanf
这是我的代码.我在QT的一个函数中使用它,但程序退出,我不知道为什么.
int xy;
xy = 0;
QVector<double> x(1000), y(1000);
FILE *file;
char line[1024];
file = fopen("ecg.txt", "r");
while (fgets(line,1024,file) != NULL)
{
fscanf(file,"%d, %d", &y[xy], &x[xy]);
xy++;
}
QwtPlotCurve *curve = new QwtPlotCurve;
curve->attach(plot_all[0]);
curve->setData(x,y);
Run Code Online (Sandbox Code Playgroud)
我得到一个分段错误的while行
我的文件每行只有两个双打; 它们是成对的坐标.
我检查了我的x和y,结果是 [0; 0; 0; 0; ...0; 0; 0]
您必须将指针传递给fscanf():
fscanf(file,"%d, %d", &y[xy], &x[xy]);
Run Code Online (Sandbox Code Playgroud)
此外,因为x和y是矢量double,你需要%lf用来读取值.您还应该检查返回值fscanf()以确保成功读取了两个值:
if (fscanf(file, "%lf, %lf", &x[xy], &y[xy]) != 2)
...handle error...
Run Code Online (Sandbox Code Playgroud)
你需要打开编译警告并修复编译器警告的内容 - 或者获得一个更好的编译器,它会给你这样的警告(g++ -Wall如果你使用G ++,这是一个好的开始).
还要注意,这个奇怪的代码读入一行line,然后直接从文件中读取一些数字.你的意思是写:
if (sscanf(line, "%lf, %lf", &x[xy], &y[xy]) != 2)
...handle error...
Run Code Online (Sandbox Code Playgroud)
你得到的东西会fgets()读到第一行(假设不超过1 KiB),然后fscanf()读取一行上的前两个数字,下一次迭代fgets()将读取该行的残差,留下fscanf()查找数字在下一行.不寻常,但一个可行的方案.
在评论中,您说每行的格式是xtaby; 如果是这种情况并且没有逗号分隔值,则需要从格式字符串中删除逗号:
if (sscanf(line, "%lf %lf", &x[xy], &y[xy]) != 2)
...handle error...
Run Code Online (Sandbox Code Playgroud)
但是,如果您的崩溃确实发生在该while行中,那么您的问题几乎肯定是该文件无法打开.始终检查fopen()(或任何其他文件打开功能)的返回.你可能无法打开一个文件有很多很多原因,并且在假设文件打开的时候也没有带来幸福.
此外,在C++中,最好在定义变量时初始化变量:
FILE *file = fopen("ecg.txt", "r");
if (file == 0)
...handle error...
QVector<double> x(1000), y(1000);
char line[1024];
int xy = 0;
Run Code Online (Sandbox Code Playgroud)