Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++ - Fatal编程技术网

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 done

std::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,原因有两个:

  • find()
    根本找不到匹配项时,您的计算结果为true

  • find()
    在位置0(字符串的第一个字符)找到匹配项时,计算结果为false

您需要更改以下内容:

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!!!为什么?