2017-04-05 17 views
0

C言語で並列openmpをプログラミングしています。このコードを使用して.txtファイルから100万のデータを読み込みます。Cプログラムでファイル.txtを読む

FILE *data = NULL; 
data = fopen("1millon.txt","r"); 

float ID, n, cord[1000000],cordy[1000000]; 
int ale = 1000000; 
for(i=0;i<ale;i++){ 

fscanf (data, "%f %f", &ID, &n); 
    cordx[i]=ID; 
    cordy[i]=n; 
} 

実際にこの「fscanf」は、通常のコンピュータでプログラムを実行するとうまくいきます。しかし、並列化のためにクラスタ内で実行したいのであれば、次の警告が表示されます(警告:属性 'warn_unused_result [-Wunused-result]で宣言された' fscanf 'の戻り値を無視する) fscanf(data、 "%f %fを "& ID、& n)は、それが実行されません ) 。"

は、あなたがどのように代わりに "関数fscanf" の.txtファイルを読むための別の方法を知っていますか、 "関数fread"

ありがとう

+0

1.「それは動作しません」という状況については十分な説明ではありません。プログラムがコンパイルされないか、正しく実行されないのですか? 2. IDとnはintとして宣言されていますが、scanfはそれらをfloatとして扱います。それはどこでもうまくいったことはかなり素晴らしいです。 3. cordxとcordyの定義を追加できますか? – fvu

+0

浮動小数点をintに読み込まないでください。うまくいかないでしょう。 – ThingyWotsit

+1

あなたがそれらを読むときにIDとnをprintf()してください。それはまったく「標準的な」テスト/デバッグチェックです。あなたがそれらのようなことをしない限り、または実際のデバッガを使用して、あなたは進歩しません。 – ThingyWotsit

答えて

1

fscanf()は何かを返します。 o問題や特殊な状況を検出するのに役立ちます。あなたのクラスタは、それに不平を言うように設定されています。自分のPCはそのように構成されていないので、警告しません。

クラスタ上の警告を回避するには、戻り値を無視しないでください。私。あなたが正常にマッチしたかどうかをチェック

また、(void) fsanf...を実行すると、コンパイラに "わたしは意図的に有用な戻り値を無視します。" (返り値セクション内)、あなたはそれがあなたの2つのfloat値読んで成功だときfscanfへのお電話は2を返すことを期待すべきであるopengroup fscanf manpagesによると

:正常に完了すると

を、これらの関数正常にマッチして割り当てられた入力項目の数を返します。初期のマッチングに失敗した場合は、この値は0になります。

2より少ない値を返した場合、間違った入力を破棄したり(この例を参照)、処理を終了するか、他の方法でエラーを処理するために余分な作業が必要になります。そうでないと、fscanfへの今後の電話は、stdinと同じごみが未読のまま残っているために失敗します。

if (fscanf(data, "%f %f", &ID, &n) != 2) { 
    fscanf(data, "%*[^\n]"); // read and discard up to the next newline character 
    fgetc(data);    // ... and discard the newline character, too 
    /* XXX: What to do with cordx[i] and cordy[i]? */ 
} 
+0

@Sebありがとう、良い追加情報。 (それはおそらく私の方法でいくつかの評判を導いたでしょう。) – Yunnosch

+0

あなたの答えは良いです、私の本の刻みを得るのに十分です。細部を加えるためにそれを書き換えるポイントはありません。また、私は担当者が本当に必要ない。私はバッジatmを追いかけている;) – Sebivor

関連する問題