• 締切済み

構造体、ポインタ、ファイル入出力 VC++

プログラム初心者です。質問させていただきます。(先ほど回答してくださったみなさん、申し訳ありません。)ファイルをファイルストリームを使い、構造体へポインタを使って読み込みます。ファイルの中身は一行にlong型(ID)、char型配列(名前)、double型(点数)で、それが何行もあります。ID,名前,点数の間は空白です。このファイルを読み込んで、平均点や、最高点などをポインタを使ってするのですが、参考文献読んでみたのですが、うまくいきません。配列を使ってファイルを読み込んではいけないので、困っています。下のプログラムを見て、おかしい所がありましたら、ご教授いただけないでしょうか?よろしくお願いします。 /*** 挿入 ***/ void insert(StdRecList &List, StdRec *&pPre, long id, char *nm, double mk) { StdRec *pNew; if(!(pNew = new StdRec)) return; pNew->ID = id; strcpy(pNew->name, nm); pNew->mark = mk; pNew->next = NULL; if(pPre == NULL){ pNew->next = List.top; List.top = pNew; }else{ pNew->next = pPre->next; pPre->next = pNew; } return; }//insert /*** リストの作成 ***/ void build(StdRecList &List) { char ch; char filename[20]; ifstream fp; StdRec *pPre; long ID = 0; char name[20]; double mark = 0.0; //ファイルを開ける cout << "\nPlease input file name : "; cin >> filename; fp.open(filename, ios::nocreate); if(!fp){ cerr << "\nCannot open..." << filename << endl; exit(1); } List.top = NULL;     //↓ここがどうもおかしい気がします。 while((ch = fp.peek()) != EOF){ insert(List, pPre, ID, name, mark); } fp.close(); return; }//build

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

補足なんですけど、 気のついたことを少し… build()の中で、 StdRec *pPre; で、pPre作ってますよね、 それでこれを『初期化せず』に、insertに渡していますよね。 insertでは、挿入する場所が入っている(最初は挿入すべき場所がないので、NULL)を期待していますよね。 しかし、実際は、pPreは、NULLでもなんでもないメモリ上のゴミです。 あと、これは、好みの問題でもあるのですが、なぜ参照渡し(&)を多用するのでしょうか 私的には、他の関数の中で確保されたものを参照で渡すのは、キモチ悪いです。 それと、関係ないですが、 これぐらいプログラムを書けるのに、 決定的に自分の書いたプログラムの理解がない(chのような使われていない変数があるとか)のが不思議です。

Japaralian
質問者

お礼

参考文献をひたすら読んで、真似をしてやっております。ほとんどの参考文献では、構造体の中身が struct Node { int num; Node *link; }; struct List { Node *head; }; のように、ひとつしかデータを扱っていませんでした。私はいろいろなデータを中に格納したかったので、すごく困っていました・・・ 遅くなりましたが、BLUEPIXYさんの言った通りpPreを初期化するとうまくいきました。どうもありがとう御座いました。もっと勉強します(汗;

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

他の部分は知りませんが、少なくとも コメントで自分で書いておられる通り、 ファイルの入力をcharで1文字ずつ入力してますけど、それが使われていません。 insertを呼び出す前に、 ID,name,mark をファイルから読み出した内容でセットしないといけません。 参考にして下さい。結構適当ですので、直してね。 #include <fstream.h> #include <iostream.h> int main(void){ ifstream fp; long ID = 0; char name[20]; double mark = 0.0; fp.open("1.txt", ios::in); while(fp.eof()==0){ fp >> ID >> name >> mark; cout << "ID=" << ID << ",name=" << name << ",mark=" << mark << endl; } fp.close(); return 0; }

Japaralian
質問者

補足

早速のご返事ありがとう御座います。ファイルの開け方については解ったのですが、ポインタを使って構造体に格納したいのですがなかなかうまくいきません。教えていただけませんか?構造体は↓ struct StdRec { long ID; char name[20]; double mark; StdRec *link; }; struct stdList { StdRec *head; }; こんな感じなのですが。よろしくお願いします。

関連するQ&A