C++ clear()做什么?

C++ clear()做什么?,c++,g++,C++,G++,如果我的代码中没有istring.clear(),则输出为“nan%”。一切正常,如果有,产量为60%。它在那里真正做什么?为什么会有不同?(注:我的输入是“y”) #包括 #包括 #包括 #包括 使用名称空间std; //内联函数 内联ifstream&read(ifstream&is,字符串f_name); //主要功能 int main() { 字符串f_name=(“dcl”); ifstream读取文件; 读取(读取文件,f_名称); 字符串温度,字; istring流istring;

如果我的代码中没有istring.clear(),则输出为“nan%”。一切正常,如果有,产量为60%。它在那里真正做什么?为什么会有不同?(注:我的输入是“y”)

#包括
#包括
#包括
#包括
使用名称空间std;
//内联函数
内联ifstream&read(ifstream&is,字符串f_name);
//主要功能
int main()
{
字符串f_name=(“dcl”);
ifstream读取文件;
读取(读取文件,f_名称);
字符串温度,字;
istring流istring;
双计数器=0.0,总计=0.0;
while(getline(readfile,temp))
{
istring.str(温度);
while(istring>>word)
{
如果(单词==“y”)
++计数器;
如果(单词==“n”| |单词==“y”)
++总数;
}
istring.clear();
}
双因素=计数器/总数*100;
cout
clear()
重置流上的错误标志(您可以在中读取)。如果使用格式化提取,则如果提取失败(例如,如果您尝试读取整数,并且没有任何可解析的内容),将设置错误标志“fail”(失败)。因此,如果使用错误状态终止循环,则必须在进入下一个循环之前使流再次可用

但是,在您的特定情况下,您的代码编写得很糟糕,并且违反了“最大局部性原则”。作为奖励,不需要
clear()
,更理智的版本如下:

std::string temp;
while (std::getline(readfile, temp))
{
  std::istringstream iss(temp);
  std::string word;

  while (iss >> word)
  {
      std::cout << word << "_" << std::endl;
      if (word == "y") ++counter;
      if (word == "y") ++total;
  }
}
std::字符串温度;
while(std::getline(readfile,temp))
{
标准:istringstream iss(温度);
字符串字;
while(iss>>word)
{
std::cout
clear()
重置流上的错误标志(您可以在中读取)。如果使用格式化提取,则如果提取失败(例如,如果您尝试读取整数,并且没有任何可解析的内容),将设置错误标志“fail”(失败)。因此,如果使用错误状态终止循环,则必须在进入下一个循环之前使流再次可用

但是,在您的特定情况下,您的代码编写得很糟糕,并且违反了“最大局部性原则”。作为奖励,不需要
clear()
,更理智的版本如下:

std::string temp;
while (std::getline(readfile, temp))
{
  std::istringstream iss(temp);
  std::string word;

  while (iss >> word)
  {
      std::cout << word << "_" << std::endl;
      if (word == "y") ++counter;
      if (word == "y") ++total;
  }
}
std::字符串温度;
while(std::getline(readfile,temp))
{
标准:istringstream iss(温度);
字符串字;
while(iss>>word)
{

std::cout maximum locality principle意味着最大化空间?所以我真的不需要istring.clear()语句,对吗?@ihm:不,它意味着将变量声明保持在尽可能局部的范围内。在您的情况下,您不需要循环外的字符串流,所以您只需要声明(并因此初始化)在循环中,当你完成它时,不要害怕扔掉一些东西,当你在C++中需要时,你可以得到一些新的东西。)当你初始化一个新的流时,它的错误标志会自动被取消。酷。它解决了这个问题。我想我需要把每个变量保持在正确的范围内,不要在这里和那里声明它们。对吗??@ihm:在适当的范围内声明变量绝对是一个好主意。这将使代码更易于阅读、维护和重构。想象一下,你想移动代码的一部分;如果你在需要的地方拥有所有东西,那将更简单。最大局部性原则意味着最大化空间?所以我真的不需要istring.clear()语句,对吗?@ihm:不,这意味着将变量声明保持在尽可能局部的范围内。在您的情况下,您不需要循环外的字符串流,因此您只需要声明(并因此初始化)在循环中,当你完成它时,不要害怕扔掉一些东西,当你在C++中需要时,你可以得到一些新的东西。)当你初始化一个新的流时,它的错误标志会自动被取消。酷。它解决了这个问题。我想我需要把每个变量保持在正确的范围内,不要在这里和那里声明它们。对吗??@ihm:在适当的范围内声明变量绝对是一个好主意。这将使代码更易于阅读、维护和重构。想象一下,你想移动其中的一部分;如果你把所有需要的东西都准备好了,那就简单多了。