2010-04-25 108 views
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; 
} 

感謝

+0

您可能想寫入控制檯所有的東西來查明問題,例如什麼'cnt'包含。當你編寫記錄時也會顯示代碼,因爲根據類聲明的方式來判斷,可能會認爲字符串之後有長度。 – 2010-04-25 06:03:39

回答

3

你可能應該使用cnt--而不是-- cnt無處不在。第一個零字節字符串將觸發一個非常大的循環,最終消耗所有內存(可能在64位操作系統上除外)。其實,甚至不打擾這個問題。環路get()效率極低,只需撥打read()即可。

+0

感謝,它的工作原理 – 2010-04-25 06:07:28

+0

+1因爲cj可能會忘記。 – erisco 2010-04-25 06:11:25

+0

謝謝大家。 :-) – 2010-04-25 06:24:52

0

如果我理解你的問題正確,你當你運行此看到一個無限循環?

我很想知道什麼是cnt是在每個循環之前。

此外,你的代碼是否真的使它x.print()


此外,這聽起來像是一個很好的時間拿出一個調試器並在您的代碼上運行它。如果它是一個無限循環,調試器會很快告訴你你卡在哪裏。

+0

是的,我看到無限循環 CNT讀取字符串有多長 例如:4wine CNT讀取4,用它來閱讀x.read沒有我想的無限循環中存在串 () – 2010-04-25 06:03:59