2015-10-04 1 views
3

Я хочу прочитать некоторые значения из файла и вернуть их коды. например, если у меня есть «если (х = 3)» в файле, то результат будет что-то вроде этого:C++ - бесконечный цикл при чтении символов файла

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

каждое число слева есть код значения в правой части, например, для идентификатора (здесь X) это 2 и так далее.

Проблема заключается в том, что когда я открываю файл test.txt в функции SCAN и обнаружил код, он возвращает его и помещает эквивалентный символ, который будет отображаться на выходе. но с этого момента он переходит в бесконечный цикл, потому что предыдущие возвращенные символы не могут быть изменены. Таким образом, он возвращал бесконечный вывод «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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^