fscanf でファイルから入力

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dash

fscanf でファイルから入力

#1

投稿記事 by dash » 12年前

#include <stdio.h>
#include <stdlib.h>
int main(void){
    FILE *fp;
    double x, y;
    int num=0;
    if( (fp = fopen("data.txt", "r")) == NULL ){
        printf("ファイルが開けませんでした。\n");
        exit(2);
    }
    while(fscanf(fp, "%lf %lf", &x, &y) != EOF){
        num++;
    }
    printf("%d\n", num);
    fclose(fp);
    return(0);
}
このような感じで fscanf を用いて値を取得していくとき、
参照されるファイル data.txt に記述されている値が不正な場合(数値以外の記述があるなど)を判定する方法はありますか?

不正な記述があると入力が止まらないようなので num > 1000 などとすればできそうなのですが、
もっとスマートな方法はないかと思い質問させていただきました。
より適した方法があれば教えて頂きたいのですが…。

また、fscanfではプログラムで示したように2つずつ値を入力していますが、
data.txt に記述されている値が奇数個であった場合、最終的に y には 0 が代入されるのでしょうか?
それともコンパイラ等によって異なってしまうのでしょうか?



初歩的な内容かもしれませんが宜しくお願いします。

box

Re:fscanf でファイルから入力

#2

投稿記事 by box » 12年前

> 参照されるファイル data.txt に記述されている値が不正な場合(数値以外の記述があるなど)を判定する方法はありますか?

fscanf関数の戻り値について調べてみてください。

> data.txt に記述されている値が奇数個であった場合、最終的に y には 0 が代入されるのでしょうか?

data.txtをその状態にしておき、yの値を出力するコードを書いて
実験してみてください。

dash

Re:fscanf でファイルから入力

#3

投稿記事 by dash » 12年前

> fscanf関数の戻り値について調べてみてください。

入力を受け付けた値(入力が成功した値)の個数ですよね?
これを利用してどうするのでしょうか?

> data.txtをその状態にしておき、yの値を出力するコードを書いて
> 実験してみてください。

Visual C++ では 0 が与えられたのですが、これが一般的なのか(保証されるのか)を質問させていただきました。

回答頂ければ幸いです。

box

Re:fscanf でファイルから入力

#4

投稿記事 by box » 12年前

> 入力を受け付けた値(入力が成功した値)の個数ですよね?
> これを利用してどうするのでしょうか?

今回は、double型の変数を2個受け取ろうとしていますね。
にもかかわらず、fscanf関数の戻り値が0や1(つまり2以外)だったら、
入力ファイルの中にdouble型以外が混じっていると判断できるのではないでしょうか。

> Visual C++ では 0 が与えられたのですが、これが一般的なのか(保証されるのか)を質問させていただきました。

data.txtに1個だけdouble型の数値が入っている状態だと、
yの値はたまたま0になるかもしれませんし、0以外になるかもしれません。
yのために割り当てられた領域の状態がどうなっているかによります。
コンパイラにはよらないと思います。

data.txtに、3個以上の奇数個のdouble型の数値が入っている状態だと、
最終的なyの値は最後に読み取りが成功したときのものになっていると思います。

dash

Re:fscanf でファイルから入力

#5

投稿記事 by dash » 12年前

演算子の優先度について不適切な部分があって正しい戻り値を評価できていませんでした。
修正したら理想どおりの結果が得られました!
ご指導ありがとうございました。

yの入力については思い違いをしていました。
奇数であればxにしか代入されませんよね。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る