• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイル入力方法について)

ファイル入力方法について

このQ&Aのポイント
  • ファイル入力方法についての質問です。入力ファイルの内容を出力するプログラムを作成しています。
  • データ番号が入った入力データではうまくファイル入力できません。どのように解決すれば良いでしょうか?
  • 現在のソースコードでは、データ番号なしの入力データを出力することはできます。

質問者が選んだベストアンサー

  • ベストアンサー
  • yukimican
  • ベストアンサー率70% (112/159)
回答No.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];// データ  (略) } ------------------------

eliteyoshi
質問者

お礼

何度もご回答ありがとうございました。 まだまだ勉強不足ですのでがんばります。

その他の回答 (2)

  • yukimican
  • ベストアンサー率70% (112/159)
回答No.2

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)
回答No.1

いろいろと問題がありますですが、今回の場合は 読み取り時に、空行、データ番号、データ、DATAENDの区別ができていないのが原因です。 sscanfのところで、「1001」や「DATAEND」が来たらどうなりますか? sscanfの戻り値を調べて、項目数が1の時の処理を作り、 その中でさらに「1001」と「DATAEND」の区別をする必要があります。 forの二重ループの使い方もおかしいですね。 fgetsは、ファイル先頭から1行ずつ順番に読み込んでいきます。 この場合、ファイルから読み込んだデータがどのように格納されるかわかりますか? ・データ番号の下は、行数1~20,列数4のデータ というのを読むためには、まずは読み込んだ文字列がデータ番号かチェックし、 データ番号の場合、そこから最大20個のデータを読み込むという形にしないといけません。

eliteyoshi
質問者

お礼

2度もご回答ありがとうございます。 昨日、ご回答いただいた内容でソースを修正しようと半日試みましたが、うまくいきませんでした。現時点の私の能力ではすぐには無理です。

関連するQ&A