- ベストアンサー
C言語で複数列のデータを1列のみ読み込む方法
- C言語で複数列のデータを1列のみ読み込む方法について教えてください。
- 行m列の任意のデータの処理を行うプログラムで、列ごとの統計を行うためにm列目のデータを取り出したいのですが、うまくいきません。どのようなコードを書けばいいでしょうか?
- また、プログラム中でEOFを使っているためか、行数のiには全データ数が入ってしまいます。この問題を解決する方法も教えてください。
- みんなの回答 (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
その他の回答 (4)
- Wr5
- ベストアンサー率53% (2173/4061)
確かにそうなりますね。>#3 iがどこまで増えて行くのか…というので、バッファオーバーランもありそうなコードではありますが… A[][]の詳細が不明ですのでなんとも…。 # その後のjについても同様。 で……A[][]にちゃんと読み込めるコードにもなっていなかったりしますね。 エラー処理は別として…ファイルから2次元配列に読み込む。 なんてコードは検索するといろいろ見つかると思います。
お礼
回答ありがとうございます. これではA[][]に読み込めないんですか?! それ自体「どこがどう」とすぐわからないので,まだまだ勉強不足です…. ネットや参考書などもっと探してみますね.
- Tacosan
- ベストアンサー率23% (3656/15482)
数字以外, より正確には「%lf に適合しない」入力が与えられると fscanf(fp, "%lf", &A[i][0]) は 0 を返しますが, EOF は負の数である (当然 0 でもない) ので fscanf(fp, "%lf", &A[i][0]) != EOF の結果は 1 となり, したがって無限ループになる (現実的には何らかの実行時エラーで異常終了しそう) というのが「正しい動作」ではないでしょうか>#2. このようなプログラムを作った背景にある「理屈」を説明できますか?
補足
回答ありがとうございます. 正しい動作の理屈はなるほど!と思えました. プログラム作成の理屈は,正直説明できません. 参考書などを見ながら使えそうな文法を探して,理解できたものもありましたが 理解できなかったものも そのままイメージであてはめていったようなものなので…. かなり「こう動いてくれたらうれしい」という感じで書いていった部分はあります. 勉強不足は間違いないのでもっとじっくり取り組もうと思います.
- Wr5
- ベストアンサー率53% (2173/4061)
読み込んでいるファイルの内容はどんな感じなんでしょう? >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に列数が入ってくれるのではないかと思ったのですが,違うようで….
- f272
- ベストアンサー率46% (8467/18126)
ぐだぐだ言わずにデータを全部読んで必要なところだけ使えばよいだろう。
お礼
リプライありがとうございます. そうなんですが…必要な部分だけ使うために「何列目」という指定がしたいです. 一つの方法にこだわらずにもっと自分でも調べ直してみます.
お礼
回答ありがとうございます!コメントが遅くなってすみません. 配列に格納するタイミングが違うんですね!! その後何とかプログラムできました.