Я хочу прочитать некоторые значения из файла и вернуть их коды. например, если у меня есть «если (х = 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;
}
Я отправил резюме моего кода, чтобы можно было легко прочитать, который содержит петлю для алфавитов цифр пространств (просто игнорирует пробелы) и «(» .
Да есть все режимы, рассмотренные, но я не копируют их, потому что пост не становится слишком долго – Payf1
Не открывать файл в 'функции SCAN': она будет читаться с самого начала каждый раз, , Вам нужно будет открыть его перед разбором и ссылкой на поток для различных функций. –
есть ли способ сделать это, не меняя основной программы? – Payf1