代码在我的循环中读取额外的行?
Code reading extra line in my loop?
我的目标是从输入文件中读取并计算至少有 1 个小写字母和 1 个数字的行数。我已经解决了我的其余代码,这些代码计算了所有小写字母、大写字母、数字、字符和单词没问题。我还从输入文件中读取并逐字反转行。我似乎无法弄清楚为什么当只有 7 行、1 个小写字母和 1 个数字时,代码计算 8 行。在对所有其他循环使用 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 和 top,并且还声明了我的 sstream 变量。我的库包括 <sstream>
<fstream>
<string>
<iostream>
和 <algorithm>
(用于早期部分。
我得到的输出是
8
当它应该是 7 时。最后一行没有小写字母也没有数字,因此不应计算在内。我在想第一行正在被第二次读取然后停止。我正在学习 C++ class,但还没有学习如何使用调试器。提前谢谢你。
你明确表示你将所有 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;
更好的是,您可以只在 read 行 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 范围。
我的目标是从输入文件中读取并计算至少有 1 个小写字母和 1 个数字的行数。我已经解决了我的其余代码,这些代码计算了所有小写字母、大写字母、数字、字符和单词没问题。我还从输入文件中读取并逐字反转行。我似乎无法弄清楚为什么当只有 7 行、1 个小写字母和 1 个数字时,代码计算 8 行。在对所有其他循环使用 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 和 top,并且还声明了我的 sstream 变量。我的库包括 <sstream>
<fstream>
<string>
<iostream>
和 <algorithm>
(用于早期部分。
我得到的输出是
8
当它应该是 7 时。最后一行没有小写字母也没有数字,因此不应计算在内。我在想第一行正在被第二次读取然后停止。我正在学习 C++ class,但还没有学习如何使用调试器。提前谢谢你。
你明确表示你将所有 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;
更好的是,您可以只在 read 行 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 范围。