这是我的代码。我在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);
我在while
行
我的文件每行只有两个双打;它们是坐标对。
我检查了我的x和y,结果是[0; 0; 0; 0; ...0; 0; 0]
答案 0 :(得分:5)
您必须将指针传递给fscanf()
:
fscanf(file,"%d, %d", &y[xy], &x[xy]);
此外,由于x
和y
是double
的向量,因此您需要使用%lf
来读取值。您还应检查fscanf()
的返回值,以确保成功读取两个值:
if (fscanf(file, "%lf, %lf", &x[xy], &y[xy]) != 2)
...handle error...
你需要打开编译警告并修复编译器警告的内容 - 或者获得一个更好的编译器来提供这样的警告(如果你使用G ++,g++ -Wall
是一个好的开始)。
请注意,这个奇怪的代码会在line
中读取一行,然后直接从文件中读取一些数字。你的意思是写:
if (sscanf(line, "%lf, %lf", &x[xy], &y[xy]) != 2)
...handle error...
你所拥有的将fgets()
读取第一行(假设不超过1 KiB),然后fscanf()
将读取一行上的前两个数字,并且下一次迭代fgets()
将读取该行的剩余部分,留下fscanf()
以查找下一行的数字。不寻常,但可行的方案。
在评论中,您说每行的格式为x
标签 y
;如果是这种情况并且没有逗号分隔值,那么您需要从格式字符串中删除逗号:
if (sscanf(line, "%lf %lf", &x[xy], &y[xy]) != 2)
...handle error...
但是,如果您的崩溃确实发生在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;