Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的逻辑有什么问题?尝试计算文件中包含特定字符的字数_C++_Function_C++11_Count_Character - Fatal编程技术网

C++ 我的逻辑有什么问题?尝试计算文件中包含特定字符的字数

C++ 我的逻辑有什么问题?尝试计算文件中包含特定字符的字数,c++,function,c++11,count,character,C++,Function,C++11,Count,Character,第一次发布问题。正在寻求调试帮助。我试图找出我的逻辑在c++11函数中哪里是错误的。目标是在文件中搜索给定的字符,并记录它所在的字数、行数以及它在文件中出现的总次数。行数和出现的总数都是准确的,但是字数是错的,我认为这是因为我的逻辑。lwc是我创建的一个类,具有int-set方法。如果我正确地计算有特定字符的单词数量,我会错在哪里?谢谢你抽出时间 void findChar(lwc *CH, string File) { ifstream file(File); int a=0; int b=0

第一次发布问题。正在寻求调试帮助。我试图找出我的逻辑在c++11函数中哪里是错误的。目标是在文件中搜索给定的字符,并记录它所在的字数、行数以及它在文件中出现的总次数。行数和出现的总数都是准确的,但是字数是错的,我认为这是因为我的逻辑。lwc是我创建的一个类,具有int-set方法。如果我正确地计算有特定字符的单词数量,我会错在哪里?谢谢你抽出时间

void findChar(lwc *CH, string File)
{
ifstream file(File);
int a=0;
int b=0;
int c=0;
string line;
bool i = false;
bool j = false;
char ch;
while (!file.eof())
{

        getline(file, line);
        for (int g=0; g<line.length(); g++)
        {       ch = line[g];
                if (ch == CH->getChar()) //to count characters
                {a++; i= true; j = true;}

                if (isspace(ch) && j) //to count words
                {c++; j=false;}
        }
        if (i)                 //to count lines
        {b++; i = false;}

}

CH->setWords(c);
CH->setChars(a);
CH->setLines(b);

}
void findChar(lwc*CH,字符串文件)
{
ifstream文件(file);
int a=0;
int b=0;
int c=0;
弦线;
bool i=假;
bool j=假;
char ch;
而(!file.eof())
{
getline(文件,行);
for(int g=0;ggetChar())//用于计数字符
{a++;i=true;j=true;}
if(isspace(ch)&&j)//计算字数
{c++;j=false;}
}
if(i)//计算行数
{b++;i=false;}
}
CH->setWords(c);
CH->setChars(a);
CH->设定线(b);
}
正如已经指出的那样,这已经是错误的。由于以下
getline()
,在错误的迭代中只会读取一个空字符串,因此此错误的影响基本上得到了缓解,但它仍然是一个错误,您应该修复它

但您的主要缺陷在于:

   if (ch == CH->getChar()) //to count characters
   {a++; i= true; j = true;}

   if (isspace(ch) && j) //to count words
   {c++; j=false;}
这取决于每个单词后面都有一个空格,以便将
j
重置为false。您正在使用
j
作为一个标志,当字符作为单词的一部分被发现时,该标志将被设置,因此当遇到单词后面的空格时,
c
将递增(字符出现在其中的字数),并且
j
将被重置

然而,您会震惊地发现,并非文件中的每个单词后面都会有空格。每行的最后一个单词后面都不会有空格(除非在行尾有一个明确的尾随空格)。惊喜


因此,您将在
j
保持设置为true的情况下完成当前行的迭代。当循环在下一行再次迭代时,
j
将保持设置为
true
,然后您的逻辑将错误地得出结论,您的字符出现在下一行的第一个单词的某个位置,而实际上它没有出现。

您假设所有单词都以空格结尾,但是一行末尾的单词可能没有尾随空格。
如果((isspace(ch)| g==line.length()-1)和&j)//要计算字符数,请考虑您的评论和答案,这就是我的想法。它在我的测试中给出了正确的输出。我取出了file.eof(),将getline(file,line)添加到while语句中,并添加了line.length()-1以适应字符串末尾没有空格字符的情况

//while (!file.eof())
while (getline(file,line))
{

    //getline(file, line);
    for (int g=0; g<line.length(); g++)
    {       ch = line[g];
            if (ch == CH->getChar()) //to count characters
            {a++; i= true; j = true;}  

            if (isspace(ch) || g == line.length()-1) // to count words
            {
                    if(j)
                    {c++;j=false;}
            }
    }
    if (i)          //to count lines
    {b++; i = false;}

}
//while(!file.eof())
while(getline(文件,行))
{
//getline(文件,行);
for(int g=0;ggetChar())//用于计数字符
{a++;i=true;j=true;}
if(isspace(ch)| | g==line.length()-1)//计算字数
{
如果(j)
{c++;j=false;}
}
}
if(i)//计算行数
{b++;i=false;}
}

请阅读。是否有可能单词出现在行尾,因此后跟换行符而不是空格?首先,每行写一行以上的代码是不好的。免费提示:使用有意义的变量名,而不是
i
j
i
j
通常用作循环计数器(有点不成文的“规则”)-如果你给它们起了有意义的名字,比如
find\u char\u on\u line
find\u char\u in\u current\u word
你的代码,你会更清楚。伙计-谢谢你的阅读!如果i和j到达一条直线的末端,它不会设置为真吗?如果它到达行的末尾并且没有找到字符,i和j仍然会被设置为true,这是一个错误(如果我错了,请纠正我)。但考虑到你所说的,我想我找到了答案
//while (!file.eof())
while (getline(file,line))
{

    //getline(file, line);
    for (int g=0; g<line.length(); g++)
    {       ch = line[g];
            if (ch == CH->getChar()) //to count characters
            {a++; i= true; j = true;}  

            if (isspace(ch) || g == line.length()-1) // to count words
            {
                    if(j)
                    {c++;j=false;}
            }
    }
    if (i)          //to count lines
    {b++; i = false;}

}