当我尝试比较C ++中的两个字符串(一个从文件读入,另一个分配了一个值)时,输出错误:
ifstream pgmFile;
pgmFile.open(fileName);
string temp;
string comp = "P5";
for(int i = 0; i < 2; i++)
{
pgmFile >> noskipws >> temp;
cout << temp;
}
if(temp == comp)
{}
else
cout << "File does not contain 'P5'. Please provide the correct type of file." << endl;
理论上,这应该返回“true”,即这两个字符串是正确的。 temp =“P5”的输出,所以我不明白为什么它每次都会碰到我的其他情况。非常感谢任何帮助!
答案 0 :(得分:4)
最有可能发生这种情况是因为您将值读入temp
两次(在您的第一个for循环中)。第二次读取空字符串(例如,状态应为EOF)。当您打印空字符串时,您看不到它。然后,你将''与'P5'进行比较,这两件事情是不一样的。
您可以在“for”循环后移动打印语句,以查看它所拥有的值,并将与“P5”进行比较。
希望它有所帮助。祝你好运!
答案 1 :(得分:1)
noskipws
将把空白字符('\ r','\ n','\ t'等)加载到字符串中。如果你检查temp
的长度,由于最后的空格,它可能与comp
的长度不同(如果我不得不猜测,我会说它可能是换行符)。
编辑:我在循环中闪烁 - 你不需要它,第二次读取可能是设置pgmFile.bad标志(因为第一次读取将读取整个文件,如果“P5”就是所有它)。
答案 2 :(得分:-3)
似乎std :: string的某些实现有一个成功比较的运算符==(),但这不是通用的,如std::string reference所示。
如果您的环境中存在这种情况,则以下情况适用:
归结为你所测试的平等。 temp和comp是不同的字符串,因此在内存中有不同的地址。简而言之,在这个意义上它们并不相同。
您需要做的是比较字符串中的字符。 String有一个compare()函数来执行此操作,它将返回-1,0或1,具体取决于相对字符串。