无法从C ++中的文本文件中读取

时间:2013-02-12 01:16:31

标签: 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);

我在while

中遇到了细分错误

我的文件每行只有两个双打;它们是坐标对。

我检查了我的x和y,结果是[0; 0; 0; 0; ...0; 0; 0]

1 个答案:

答案 0 :(得分:5)

您必须将指针传递给fscanf()

fscanf(file,"%d, %d", &y[xy], &x[xy]);

此外,由于xydouble的向量,因此您需要使用%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;