2013-02-12 55 views
0

这里是我的代码读取。我在QT中使用它的功能,但程序退出,我不知道为什么。无法从C++中的文本文件

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]

+3

确定调用'fopen'成功了吗? – 2013-02-12 01:19:17

+1

你有一行文字,那么两个坐标值? – 2013-02-12 01:25:31

+0

没有,这就像 X(标签)Y – SamuelNLP 2013-02-12 01:27:33

回答

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昆明植物研究所长),那么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; 
+0

该文件与我的程序路径相同。与代码中的名称相同。但我认为这不是开放的。 – SamuelNLP 2013-02-12 01:25:03

+0

Thnaks,x值是现在确定,但作为文件在x和y之间的分离是不是一个空间,但一个选项卡,我无法读取在y。 – SamuelNLP 2013-02-12 01:35:17

+1

查看我对格式字符串中逗号的评论;除非用逗号分隔值,否则不需要它。如果你从'fscanf()'或'sscanf()'获得了返回值 - 例如,用'int n = fscanf(...);' - 你可以打印出来并看到你已经返回1。 – 2013-02-12 01:38:17