0

これは長さインジケーターフィールドの実装ですが、ハングし、ループでスタックして何も表示されないと思います。

// readx22.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "fstream"
#include "stdio.h"
using namespace std;


class Student
{
public:
 string id;
 size_t id_len;
 string first_name;
 size_t first_len;
 string last_name;
 size_t last_len;
 string phone;
 size_t phone_len;
 string grade;
 size_t grade_len;
 void read(fstream &ven);
 void print();
};
void Student::read(fstream &ven)
{
 size_t cnt;
 ven >> cnt;
 id_len=cnt;
    id.reserve( cnt );
    while ( -- cnt ) {
        id.push_back( ven.get() );
    }

 ven >> cnt;
 first_len=cnt;
    first_name.reserve( cnt );
    while ( -- cnt ) {
        first_name.push_back( ven.get() );
    }

 ven >> cnt;
 last_len=cnt;
    last_name.reserve( cnt );
    while ( -- cnt ) {
        last_name.push_back( ven.get() );
    }

 ven >> cnt;
 phone_len=cnt;
    phone.reserve( cnt );
    while ( -- cnt ) {
        phone.push_back( ven.get() );
    }

 ven >> cnt;
 grade_len=cnt;
    grade.reserve( cnt );
    while ( -- cnt ) {
        grade.push_back( ven.get() );
    }

}
void Student::print()
{
// string::iterator it;
 for ( int i=0 ; i<id_len; i++)
  cout << id[i];

}
int main()
{
 fstream in;
 in.open ("fee.txt", fstream::in);
 Student x;
 x.read(in);
 x.print();
 return 0;
}

ありがとう

4

2 に答える 2

3

おそらくどこでもcnt--ではなく使用すべきだったでしょう-- cnt。最初のゼロバイト文字列は非常に大きなループをトリガーし、最終的にすべてのメモリを消費します(64ビットOSを除く)。実際には、この修正を気にしないでください。ループオーバーget()は非常に非効率的です。を呼び出すだけread()です。

于 2010-04-25T06:02:05.233 に答える
0

私があなたの質問を正しく理解している場合、これを実行すると無限ループが発生しますか?

各ループの前にcntが何であるか知りたいです。

また、あなたのコードは実際にx.print()に到達しますか?


また、これはデバッガーを取り出してコードで実行するのに最適な時期のように思えます。無限ループの場合、デバッガーはスタックしている場所をすばやく通知します。

于 2010-04-25T06:00:33.987 に答える