0

そのため、先生は数週間前に行ったラボのソリューションを教えてくれましたが、課題を提出したときに使用していたものとは異なります。このコードをアドレス帳プログラムに入力しましたが、何も出力されませんでした。これをメインから画面に出力する方法を誰か知っているかどうか疑問に思っていました。私はいくつかのことを試しましたが、私ができる最善の方法は、印刷するエントリを 1 つだけ取得することです。与えられたコードは次のとおりです。

void addressBook::showAll2(string fName)
{
 PERSON p;
 PEOPLE2 tp;
 ifstream inData(fName.c_str(), ios::in);
 if(inData.fail())
 throw AddressBookException("Cannot open file to read ");
 people.clear();
 int i = 0;
 while(!inData.eof())
 {
 inData.seekg(i * sizeof(PEOPLE2));
 inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
 p.fName = tp.fName2;
 p.lName = tp.lName2;
 p.Address = tp.Address2;
 people.push_back(p);
 i++;
 }  
 inData.close();
 return; 
}

私が変更したのは例外のスローだけです (現在のプロジェクト)。これは以前はブール関数で、true または false を返します。彼はその部分に関与していないため、コード形式のメインは提供されませんでした。これを画面に出力する方法を誰かが知っているかどうか疑問に思っています。私はこれに変更しようとしました:

void addressBook::showAll2(string fName, string &str)
{
 PERSON p;
 PEOPLE2 tp;
 ifstream inData(fName.c_str(), ios::in);
 if(inData.fail())
 throw AddressBookException("Cannot open file to read ");
 people.clear();
 int i = 0;
 while(!inData.eof())
 {
 inData.seekg(i * sizeof(PEOPLE2));
 inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
 p.fName = tp.fName2;
 p.lName = tp.lName2;
 p.Address = tp.Address2;
 people.push_back(p);
 i++;
inData >> str;
 }  
 inData.close();
 return; 
}

そして主に私はこれを持っています:

void printFile()  //prints stored file info to screen
 {  
 string str;
 addressBook *newBook = addressBook::newbookInst();
 Menu *m = Menu::menuInst();
 try
 {
 newBook->showAll2("addressbook", str);

 cout << str << '/n' << endl;
 }
    catch(exception e)
{
    cerr << e.what();
}
 m->waitKey();
 }

それで、誰かが私が欠けているものを見せてくれますか? 割り当てはすでに完了しているので、必要に応じて詳細に説明してください。または、コードを投稿してください。私はそれを理解できます。このコードでこれを印刷する方法を理解しようとすると、少し頭がおかしくなりそうです。(私のバージョンは問題なく動作しましたが、これは何もしません。)ありがとう

4

1 に答える 1

1

あなたの教授のコードは、間違った場所で eof をテストし、不必要なシークも行うため、間違っています。あなたの教授が悪いコードを書いているのではないかと心配しています。

while(!inData.eof())
{
    inData.seekg(i * sizeof(PEOPLE2));
    inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
    ...
}

このように書くべきです

for (;;)
{
    inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
    if (inDate.eof())
        break;
    ...
}

の前ではなく、読んだに eof をテストする必要があります。これは初心者の間で非常によくある間違いですが、教授が犯すべき間違いではありません。第二に、ファイルを最初から最後まで調べているだけなので、seekg は必要ありません。これはバグではありませんが、必要ではありません。

inData.closeifstream デストラクタがファイルを閉じるため、これも不要です。

あなたの質問への答えは単にこれです

inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
p.fName = tp.fName2;
p.lName = tp.lName2;
p.Address = tp.Address2;
cout << p.fName << ' ' << p.lName << ' ' << pAddress << '\n';

教授のバージョンのループでそのコードを試してみると、なぜバグが発生したのかがわかります。

于 2013-05-06T04:59:04.367 に答える