代码读取我的循环中的额外行

Code reading extra line in my loop?

本文关键字:读取 我的 循环 代码      更新时间:2023-10-16

我的目标是从输入文件中读取并计算至少具有 1 个小写字母和 1 位数字的行数。我已经解决了其余的代码,这些代码计算了所有小写,大写,数字,字符和单词都没有问题。我还从输入文件中读取并逐字反转了这些行。我似乎无法弄清楚为什么代码要计算 8 行,而只有 7 行,小写 1 个数字。在将 getline() 用于所有其他循环时,我没有遇到任何问题。我不是专门找人为我写代码的人。如果可能的话,我只想解释一下为什么会发生这种情况?

我的输入文件包含:

This is a test file for hw3 
How many Uppercase letters are in this f1le?
How many Lowercase letters are in this F1le?
H0W mAnY dIg1ts ar3 1N in this FILe?
Turn the 1npU7 N4m3 int0 its reverse
reverse the Lines to their opp05173 coutnerpart
find tOTal NumbEr of characTer5 in F1le
THIS IS A TEST LINE

我本节的代码是:

    inFile.clear();
    inFile.seekg(0, inFile.beg);
    while(getline(inFile, line)){
        wordInput.str(line);
        wordInput.clear();
        wordInput.seekg(0);
    while(wordInput.get(c)){
        if(islower(c)){
            lowerCase++;
        }   
        else if(isdigit(c)){
            digit++;
        }   
     }   
        if(lowerCase >= 1 && digit >= 1){ 
            lineCount++;
        }
     }    
    cout << lineCount << endl;
    return 0;
 }

我已经将所有 int 变量初始化为 0 和顶部,并且我也声明了我的 sstream 变量。我的库包括<sstream> <fstream> <string> <iostream><algorithm>(用于早期部分。

我得到的输出是

8

当它应该是 7.最后一行不应计算在内,因为它没有小写字母和数字。我认为第一行正在第二次阅读,然后停止。我正在上课C++入门,还没有学习如何使用调试器。提前谢谢你。

您明确表示将所有int变量初始化为 0 ,这很棒; 但是,让我们看一下您的代码(格式化以便缩进更有意义):

// read line from file
while(getline(inFile, line))
{
    wordInput.str(line);
    wordInput.clear();
    wordInput.seekg(0);
    // read character
    while(wordInput.get(c))
    {
        if(islower(c))
        {
            lowerCase++;
        }   
        else if(isdigit(c))
        {
            digit++;
        }   
    }   
    if(lowerCase >= 1 && digit >= 1){ 
        lineCount++;
    }
}

在这里,您读取一行,并遍历该行上的所有字符,如果您找到小写字符或数字,则递增一个变量。当您阅读下一行时会发生什么?您尚未将这些变量重置回0,因此在阅读下一行时,它们都已经在1之上。

您需要以下各项:

while(getline(inFile, line))
{
    wordInput.str(line);
    wordInput.clear();
    wordInput.seekg(0);
    // We're about to start reading this line, so obviously we haven't found any yet
    digit = 0;
    lowerCase = 0;

更好的是,您可能只需在读取行while循环中声明这些变量:

while(getline(inFile, line))
{
    int digit = 0;
    int lowerCase = 0;

尽管您尚未被教导使用调试器,但使用 cout 语句是一种很好的调试方法。放入一些打印语句以确定在任何给定时间的所有变量是什么:

while(getline(inFile, line))
{
    std::cout << "read line " << line << std::endl;
    while(wordInput.get(c))
    {
        std::cout << "lowercase found so far: " << lowerCase << std::endl;
        std::cout << "digits found so far: " << digit << std::endl;
        if(islower(c))
        {
            std::cout << "lowercase character found: " << c << std::endl;
            lowerCase++;
        }   
        else if(isdigit(c))
        {
            std::cout << "digit found: " << c << std::endl;
            digit++;
        }   
    }   
    if(lowerCase >= 1 && digit >= 1)
    { 
        std::cout << "found a lowercase character (" << lowerCase << ") or a digit (" << digit << ")" << std::endl;
        lineCount++;
    }
}   

自从我用C++编码以来已经有一段时间了。除了调试器程序之外,还有其他调试方法。

我会cout << line << endl;添加到您的第一个 while 循环中。这样,您可以输出如何读取这些行以及是否有任何重复。还要检查您的islower(char)isdigit(char)函数,以确保它们读取适当的 ascii 范围。