プロが教えるわが家の防犯対策術!

行m列の任意のデータの処理を行うプログラムで,
列ごとの統計を行うためにm列目のデータを取り出したいのですが,うまくいきません.
どのようなコードを書けばいいでしょうか?

自分で作ってみたのは以下のようなプログラムです(ファイルを開いて→m列目の読み込みの部分)
EOFを使っているためか,行数のiには全データ数が入ってしまいます.


void main (void)
{
FILE* fp;

int i, j;
i=0, j=0;

char FilePath[500];
char Folder[100];
char File[50];

printf("Folder Name:");
scanf("%s",&Folder);

printf("File Name:");
scanf("%s",&File);

sprintf(FilePath,"%s/%s",Folder,File);

if(( fp = fopen (FilePath,"r")) == NULL){
printf("cannot open '%s'\n", FilePath);
exit(1);
} //ここまではうまく動きます


while (fscanf(fp, "%lf", &A[i][0]) != EOF{
i++;
}
while (fscanf(fp, "%lf", &A[0][j]) != EOF){
j++;
}

printf("A[%d][%d]", i, j);
int n, m;              //n,mはこの後for文で使いたいので登場してもらいました
printf("input 'n':");
scanf("%d", &n);
printf("input 'm':");
scanf("%d", &m);

A 回答 (5件)

>どのようなコードを書けばいいでしょうか?



 http://okwave.jp/qa/q7114321.html #3

 読み込み時に配列に格納しないで、
 文字列として1行読み込んでから、(数値化し)配列に格納する例です。

 「m列目のデータ」の前には、m - 1 個の空白があるので、それをカウントし数値化します。
 (ただし、文字列には空白が連続しないこと)

 「実数」を「整数」に、「コンマ」を「空白」に置き換えればよいかと。

 http://www.bohyoh.com/CandCPP/C/Library/fgets.html
 http://www.bohyoh.com/CandCPP/C/Library/atoi.html
    • good
    • 1
この回答へのお礼

回答ありがとうございます!コメントが遅くなってすみません.

配列に格納するタイミングが違うんですね!!
その後何とかプログラムできました.

お礼日時:2012/02/07 01:21

確かにそうなりますね。

>#3

iがどこまで増えて行くのか…というので、バッファオーバーランもありそうなコードではありますが…
A[][]の詳細が不明ですのでなんとも…。
# その後のjについても同様。
で……A[][]にちゃんと読み込めるコードにもなっていなかったりしますね。

エラー処理は別として…ファイルから2次元配列に読み込む。
なんてコードは検索するといろいろ見つかると思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます.

これではA[][]に読み込めないんですか?!
それ自体「どこがどう」とすぐわからないので,まだまだ勉強不足です….

ネットや参考書などもっと探してみますね.

お礼日時:2012/01/18 23:41

数字以外, より正確には「%lf に適合しない」入力が与えられると


fscanf(fp, "%lf", &A[i][0])
は 0 を返しますが, EOF は負の数である (当然 0 でもない) ので
fscanf(fp, "%lf", &A[i][0]) != EOF
の結果は 1 となり, したがって無限ループになる (現実的には何らかの実行時エラーで異常終了しそう) というのが「正しい動作」ではないでしょうか>#2.

このようなプログラムを作った背景にある「理屈」を説明できますか?

この回答への補足

回答ありがとうございます.
正しい動作の理屈はなるほど!と思えました.

プログラム作成の理屈は,正直説明できません.
参考書などを見ながら使えそうな文法を探して,理解できたものもありましたが
理解できなかったものも
そのままイメージであてはめていったようなものなので….
かなり「こう動いてくれたらうれしい」という感じで書いていった部分はあります.

勉強不足は間違いないのでもっとじっくり取り組もうと思います.

補足日時:2012/01/18 23:36
    • good
    • 0

読み込んでいるファイルの内容はどんな感じなんでしょう?



>while (fscanf(fp, "%lf", &A[i][0]) != EOF{
>i++;
>}
>while (fscanf(fp, "%lf", &A[0][j]) != EOF){
>j++;
>}

の先のwhileループはどこで抜けることを期待しているのでしょう?
# 今は…おそらく全部読み込んでますよね。
データファイルに意図的にエラーになるように書いていない限り。
# たとえば、各行の最後に数字以外が書かれているとか。<もっとも、これだと次のfscanf()次第でオワるのですが…。

この回答への補足

回答ありがとうございます.
データは例えば以下のような形です.
テキスト形式で,特に意味のある数字ではありません.

1 65 3
2 83 71
20 4 39

これだと3行3列なので,このデータはA[3][3]だと判断して
表示させたいです.
fscanf(fp,"%lf",&A[0][j]) では,&A[0][j]としたら
jに列数が入ってくれるのではないかと思ったのですが,違うようで….

補足日時:2012/01/18 23:23
    • good
    • 1

ぐだぐだ言わずにデータを全部読んで必要なところだけ使えばよいだろう。

    • good
    • 0
この回答へのお礼

リプライありがとうございます.

そうなんですが…必要な部分だけ使うために「何列目」という指定がしたいです.
一つの方法にこだわらずにもっと自分でも調べ直してみます.

お礼日時:2012/01/18 23:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています