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 位操作系统上除外)。实际上,甚至不必为这个修复而烦恼。循环get()非常低效,只需调用read().

于 2010-04-25T06:02:05.233 回答
0

如果我正确理解了您的问题,那么您在运行此程序时会看到无限循环吗?

我很想知道每个循环之前的cnt是什么。

另外,您的代码实际上是否可以使用x.print()


此外,这听起来像是取出调试器并在您的代码上运行它的好时机。如果是无限循环,调试器会很快告诉您卡在哪里。

于 2010-04-25T06:00:33.987 回答