- ベストアンサー
ファイル入力方法について
- ファイル入力方法についての質問です。入力ファイルの内容を出力するプログラムを作成しています。
- データ番号が入った入力データではうまくファイル入力できません。どのように解決すれば良いでしょうか?
- 現在のソースコードでは、データ番号なしの入力データを出力することはできます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.1の人です。 いきなり全部をやろうとはせずに、少しずつ段階を踏んで 組み立てていきましょう。 1) input.datを一行ずつ最後まで読み込む →fgetsしたものをprintfしてみる 2) 読み込んだ行が空行、データ番号、データ、DATAENDのどれなのか調べ、 DATAENDならループから抜けるようにする。 3) データ番号の行数を数える →カウンタを用意し、番号付きでprintf表示 4) データ番号と、次のデータ番号までの間に、 列数4(a,b,c,d)のデータが何個あるか調べる →カウンタを用意し、番号付きでprintf表示 5) 読み込んだデータを変数に格納してみる ※構造体やポインタ、#define等を使うとソースコードが見やすく、書きやすくなりますよ。 --- 例 ------------------ #define MAX_MAIN_DATA_NUM 20 #define MAX_SUB_DATA_NUM 20 #define MAX_NAME_LEN 100 // 4列のデータ typedef struct SubData{ char a[MAX_NAME_LEN]; // 1列目 char b[MAX_NAME_LEN]; // 2列目 int c; // 3列目 int d; // 4列目 }SubData; // データ番号と、1~20行のデータ typedef struct MainData{ int number; // データ番号 int count; // 列データ個数 SubData data[MAX_SUB_DATA_NUM]; // 列データ }MainData; int main(){ (略) // ファイルから読み込んだデータ int main_count = 0; // データ番号の個数 MainData main_data[MAX_MAIN_DATA_NUM];// データ (略) } ------------------------
その他の回答 (2)
- yukimican
- ベストアンサー率70% (112/159)
No.1の人です。 以下に擬似コードを書いておきますので、参考にしてください。 (検証してないので、この方法で正しく動くかかはわかりません。 ・メインデータ:データ番号と行数1~20のセット ・サブデータ:メインデータ内の各行のデータ として、 while(1行取得) { sscanfで一時変数を使って値を取得 if(sscanfの項目数が1) { if(DATAENDと一致) break; if(sscanfで整数値を取得 → 項目数1) { if(メインデータのカウンタ == 最大数) { break; } メインデータのカウンタ += 1 サブデータのカウンタ = 0 } } else if(sscanfの項目数が4) { if(サブデータのカウンタ < 最大数) { 一時変数に入れておいたものをサブデータに追加 サブデータのカウンタ += 1 } } } →結果表示
- yukimican
- ベストアンサー率70% (112/159)
いろいろと問題がありますですが、今回の場合は 読み取り時に、空行、データ番号、データ、DATAENDの区別ができていないのが原因です。 sscanfのところで、「1001」や「DATAEND」が来たらどうなりますか? sscanfの戻り値を調べて、項目数が1の時の処理を作り、 その中でさらに「1001」と「DATAEND」の区別をする必要があります。 forの二重ループの使い方もおかしいですね。 fgetsは、ファイル先頭から1行ずつ順番に読み込んでいきます。 この場合、ファイルから読み込んだデータがどのように格納されるかわかりますか? ・データ番号の下は、行数1~20,列数4のデータ というのを読むためには、まずは読み込んだ文字列がデータ番号かチェックし、 データ番号の場合、そこから最大20個のデータを読み込むという形にしないといけません。
お礼
2度もご回答ありがとうございます。 昨日、ご回答いただいた内容でソースを修正しようと半日試みましたが、うまくいきませんでした。現時点の私の能力ではすぐには無理です。
お礼
何度もご回答ありがとうございました。 まだまだ勉強不足ですのでがんばります。