2015-10-04 76 views
3

我想從文件中讀取一些值並返回它們的代碼。例如,如果我有「如果(X = 3)」的文件中,則輸出將是這樣的:C++ - 讀取文件字符時的無限循環

22 if 12 ( 2 x 11 = 1 3 13 )

在左側的每個數字是在右側的值,例如一個代碼對於標識符(這裏是X),它是2等等。

問題是,當我打開函數SCAN中的「test.txt」文件並找到代碼時,它會返回它,並將等效字符顯示在輸出中。但從那時起,它會進入無限循環,因爲之前返回的字符無法更改。所以它返回了「22 if」的無限輸出。

int main() { 
int Code; 
string Str; 
do 
{ 
    Code=SCAN(Str); 
    cout<<Code<<"\t"<<Str<< endl; 
} 
while(Code !=0); 
} 

,這裏是掃描功能

int SCAN(string& String){ 
int Code; 
ifstream ifs; 
ifs.open ("test.txt", ifstream::in); 

char c = ifs.get(); 
String=c; 

while (ifs.good()) { 

if (isspace(c)){ 

    c = ifs.get(); 
} 

if (isalpha(c)){ 
    string temp; 

    while(isalpha(c)){ 
     temp.push_back(c); 
     c = ifs.get(); 
    } 
    String = temp; 
    return 2; 
} 
if(isdigit(c)){ 
    string temp; 
    while(isdigit(c)){ 
     temp.push_back(c); 
     c = ifs.get(); 
    } 
    String=temp; 
    return 1; 

} 

if(c=='('){ 
    c = ifs.get(); 
    return 12; 
} 

c = ifs.get(); 
}//endwhile 

ifs.close(); 
return 0; 
} 

我已經發布了我的代碼總結易於閱讀其中包含字母數字空間(只是忽略空格)和環「(」 。

+0

是有考慮所有的模式,但我沒有複製他們,因爲崗位沒有得到過久​​ – Payf1

+4

不要在'SCAN'功能打開文件:它將從每次啓動時讀取。您需要在解析之前將其打開,並引用流到各種函數的流。 –

+0

有沒有辦法做到這一點,而無需更改主程序? – Payf1

回答

1

我想解決這個問題,但我想知道是否有解決它不改變主要功能的任何 方式。我的意思是通過修改 只是SCAN福nction。

bool isOpened = false; 
ifstream ifs; 

int SCAN(string& String){ 
    int Code; 

    if (!isOpened) { 
     ifs.open ("test.txt", ifstream::in); 
     isOpened = true; 
    } 

    ... 

    ifs.close(); 
    isOpened = false; 
    return 0; 
}