2013-02-12 42 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