【问题标题】:C++ - infinite loop when reading characters of fileC ++ - 读取文件字符时的无限循环
【发布时间】:2016-01-01 13:33:10
【问题描述】:

我想从文件中读取一些值并返回它们的代码。例如,如果我在文件中有“if(x=3)”,则输出将是这样的:

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);
}

这里是SCAN函数

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;
}

我已经发布了我的代码摘要,以便于阅读,其中包含字母数字空格(只是忽略空格)和“(”的循环。

【问题讨论】:

  • 是的,考虑了所有模式,但我没有复制它们,因为帖子没有太长
  • 不要在SCAN函数中打开文件:每次都会从头开始读取。您需要在解析之前打开它,并将流的引用引用到各种函数。
  • 有什么方法可以在不改变主程序的情况下做到这一点?
  • @Payf1 你的意思是,有没有办法在不改变代码的情况下修复你的错误?没有。
  • 感谢您的回复巴里。我确实想解决这个问题,但我想知道是否有任何方法可以在不更改主要功能的情况下解决它。我的意思是只修改 SCAN 函数。

标签: c++ function file infinite-loop


【解决方案1】:

我确实想解决这个问题,但我想知道是否有 在不更改主要功能的情况下修复它的方法。我的意思是修改 只是 SCAN 功能。

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多