0

プログラムを実行しようとすると、最初からクラッシュします。問題はファイルからの入力です。ファイルに正常に書き込むことができます。誰かがこのコードが機能しない理由を説明できますか??

StringList::StringList()
{
  pTop=NULL;
  pBottom=NULL;

  ifstream in;
  in.open("read.txt");

  StringListNode * pCurrent;
  pCurrent = new StringListNode;
  pCurrent = pTop;

  while(!in.eof())  //reads it till the end of file
  {
    in >> pCurrent->data;
    pCurrent = pCurrent->pNext;
  }
  in.close();
}

このファイルへの出力は正常に機能します。私はそれを含めるだけだと思った。

StringList::~StringList()
{
  ofstream out;
  out.open("read.txt");

  StringListNode * pCurrent;
  pCurrent = new StringListNode;
  pCurrent = pTop;
  while(pCurrent != 0)  
  {
    out << pCurrent->data << endl;
    pCurrent = pCurrent->pNext;
  }
  out.close();
 }
4

1 に答える 1

1

pCurrent = pTop;なぜこれをここに割り当てるのですか?これにより、pCurrentヌルポインターが作成されます。削除または修正してください。

私はあなたのコードと混同しています:

pCurrent = new StringListNode; // Allocate new memory and point at it
pCurrent = pTop; // Make pCurrent point at same thing as pTop

pCurrentに2 回割り当てます。pTopデータメンバーのように見えますが、おそらくコンストラクターで意味していました:

pCurrent = new StringListNode; // Allocate new memory and point at it
pCurrent->pNext = nullptr; // Assign null to next pointer
pTop = pCurrent; // Make pTop point at new memory

pCurrent = new StringListNode;何もしないので、デストラクタで削除します。

出力時にpCurrent != 0は をチェックしますが、読み取り時には null をチェックしません。おそらくpCurrentヌルポインタです。

また、ループ条件内の iostream::eof が間違っていると見なされる理由をお読みください。. ループは次のようになります。

while(pCurrent && (in >> pCurrent->data)) 
{
   pCurrent = pCurrent->pNext;
}
于 2013-07-17T03:24:59.823 に答える