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

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]

Jon*_*ler 5

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

fscanf(file,"%d, %d", &y[xy], &x[xy]);
Run Code Online (Sandbox Code Playgroud)

此外,因为xy是矢量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)