代码读取我的循环中的额外行
Code reading extra line in my loop?
我的目标是从输入文件中读取并计算至少具有 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 范围。
- 我的程序没有从文件中读取并输入数据
- 如果需要转换,我可以在读取参数的同时将其移动到另一个参数吗?
- 我的文件无法正常工作,无法从C++文件中读取上下文
- 为什么我的静态分析器找不到潜在的未初始化读取?
- 为什么我的程序在读取/写入文件时会删除最重要的数字?
- 为什么我的驱动程序只读取部分字符串?
- 如何让我的程序在输入验证的基础上读取素数
- 为什么我的 cout 一次执行,尽管 cin 应该在两者之间读取?
- C++ while 循环没有从我的文件中读取 -1
- 当我读取一个大小为 17 mb 的 100 万个 url 文件时,我的程序占用大小为 163 MB
- 为什么当我使用双精度时,Qt<->Matlab 正确写入和读取我的字节,但存储 uint32 的字节不正确?
- 不会在登录名中读取C++我的文件
- 这是我的程序,C++使用 OpenCv 库从数据集中读取图像序列,但它没有运行
- 如何使用Qt读取我的应用程序屏幕像素数据
- 关于函数调用,我的程序没有读取我的其他函数。为什么?
- C++ 未读取我的 % 运算符(错误:"运算符%"不匹配)
- 为什么getline正在读取我的整个unicode文件
- 我无法让我的程序在函数中读取我的文件
- 代码读取我的循环中的额外行
- 关闭正在读取我的文件的句柄