0

これが私のコードです。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行でセグメンテーション違反が発生します

私のファイルには、1 行に 2 つの double しかありません。それらは座標のペアです。

x と y をチェックしたところ、結果は[0; 0; 0; 0; ...0; 0; 0]

4

1 に答える 1

5

へのポインタを渡す必要がありますfscanf():

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

また、xyは のベクトルであるため、値を読み取るにはdoubleを使用する必要があります。%lfからの戻り値もチェックしてfscanf()、2 つの値が正常に読み取られたことを確認する必要があります。

if (fscanf(file, "%lf, %lf", &x[xy], &y[xy]) != 2)
    ...handle error...

コンパイルの警告をオンにして、コンパイラが警告する内容を修正する必要があります。または、そのような警告を表示するより優れたコンパイラを入手する必要があります ( g++ -WallG++ を使用している場合は、これが適切な出発点です)。

また、この奇妙なコードは、行をlineに読み込み、ファイルからいくつかの数値を直接読み込むことにも注意してください。あなたは書くつもりでしたか:

if (sscanf(line, "%lf, %lf", &x[xy], &y[xy]) != 2)
    ...handle error...

あなたが持っているものfgets()は最初の行を読んだでしょう(1 KiBより長くないと仮定して)、次にfscanf()行の最初の2つの数値を読み取り、次の反復でfgets()行の残りを読み取り、fscanf()数値を見つけるために残します次の行で。珍しいが、実行可能なスキーム。

コメントでは、各行の形式はxtaby; その場合、値を区切るコンマがない場合は、フォーマット文字列からコンマを削除する必要があります。

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;
于 2013-02-12T01:20:25.967 に答える