从文本文件中读取时,即使不存在,也会找到额外的字符(例如"@")?

while reading from the text file is finding extra character (ex.'@') even if it is not there?

本文关键字:字符 例如 读取 文件 文本 不存在      更新时间:2023-10-16

这是我的代码:在这种情况下,我得到的"@"与文件中的"@"冲突

  ifstream file("text.dat");
    if(file.is_open()){
    bool flag=false;

在这里我得到了一个额外的角色

getline(file,str,'n');}

这是文本文件,我正在从这个文本文件中读取!

吉姆工作室 5 很酷哈利@jim现在正在为研讨会5工作克里斯戴夫什么^#$%!约翰@harry 我完了

std::string::find(( 如果未找到该字符,则返回std::string::npos,并且 std::string::npos 是表示字符串最大大小的常量。这是你看到的巨大数字。

您的if语句应如下所示:

if(std.find('@') != std::string::npos)
{
    //blabla
}

查看程序的输出:

"@"在这里!!!:18446744073709551615

18446744073709551615str.find("@")返回的值。 如果找到子字符串,find()返回子字符串的索引,否则返回 std::string::npos ,定义为-1强制转换为 std::string::size_type,这是一个无符号类型。 在本例中,size_type 是一个 64 位数字,因此在返回 npos 时,您最终会得到索引18446744073709551615

任何非零值都将在布尔表达式(如 if 语句(中计算为 true。 这就是为什么你最终设置flag=true . 这是代码中的错误,原因有两个:

  • find()根本没有找到匹配项时,您的评估为 true。

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

您需要更改此设置:

if(str.find("@")) flag=true;

对此:

if(str.find("@") != string::npos) flag=true;

或者简单地说:

flag = (str.find("@") != string::npos);

std::string::find() 返回 std::string::npos 如果找不到指针,则npos的值为 -1,这被强制为布尔值 true,而不是 false。

您需要直接将find()的结果与npos进行比较,而不是执行隐式强制。