C++ 从文本文件读取时,是否会发现额外的字符(例如';@';),即使该字符不存在?
这是我的代码:在本例中,我得到的“@”和文件中的“@”相冲突C++ 从文本文件读取时,是否会发现额外的字符(例如';@';),即使该字符不存在?,c++,C++,这是我的代码:在本例中,我得到的“@”和文件中的“@”相冲突 ifstream file("text.dat"); if(file.is_open()){ bool flag=false; 在这里,我得到了一个额外的字符 getline(file,str,'\n');} 这是文本文件,我正在阅读这个文本文件 吉姆很酷 harry@jim正在第五车间工作 克里斯 戴夫这是怎么回事! john@harry I'm donestd::string::find()返回std::s
ifstream file("text.dat");
if(file.is_open()){
bool flag=false;
在这里,我得到了一个额外的字符
getline(file,str,'\n');}
这是文本文件,我正在阅读这个文本文件
吉姆很酷
harry@jim正在第五车间工作
克里斯
戴夫这是怎么回事!
john@harry I'm donestd::string::find()
返回std::string::npos
如果找不到针,则npos
的值为-1,强制为布尔值true,而不是false
您需要直接将
find()
的结果与npos
进行比较,而不是执行隐式强制。查看程序的输出:
“@”在这里!!!!:18446744073709551615
18446744073709551615
是str.find(“@”)
返回的值find()
如果找到子字符串,则返回子字符串的索引,否则返回std::string::npos
,它被定义为-1
强制转换为std::string::size\u type
,这是一种无符号类型。在本例中,size\u type
是一个64位的数字,因此当返回npos
时,您将得到索引18446744073709551615
在布尔表达式中,任何非零值都将计算为true,例如if
语句。这就是为什么要设置flag=true
。这是代码中的一个bug,原因有两个:
- 当
根本找不到匹配项时,您的计算结果为truefind()
- 当
在位置0(字符串的第一个字符)找到匹配项时,计算结果为falsefind()
if(str.find("@")) flag=true;
对此,请改为:
if(str.find("@") != string::npos) flag=true;
或者简单地说:
flag = (str.find("@") != string::npos);
如果未找到字符,则返回std::string::npos
,并且std::string::npos
是表示字符串最大大小的常量。你看到的是一个巨大的数字
您的if
语句应该如下所示:
if(std.find('@') != std::string::npos)
{
//blabla
}
欢迎来到堆栈溢出。请花点时间浏览并参考中的材料,了解您可以在此处询问的内容和方式。发布一篇文章特别重要。您的文件包含@字符。。。。。这是一行“harry@jim正在第五车间工作”感谢您关注我的问题。我可以理解这行有字符,但是字符的索引是1234567895522!!!为什么?