3

当我尝试比较 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" 的输出,所以我不明白为什么每次都会遇到我的 else 情况。非常感谢任何帮助,谢谢!

4

3 回答 3

4

最有可能发生这种情况是因为您将值读入temp两次(在您的第一个 for 循环中)。第二次读取空字符串(例如,状态应该是 EOF)。当您打印一个空字符串时,您看不到它。然后,您将''与'P5'进行比较,这两个东西不一样。

您可以在“for”循环之后移动打印语句以查看它所持有的值,这将是与“P5”进行比较的值。

希望能帮助到你。祝你好运!

于 2013-09-19T19:55:40.207 回答
1

noskipws会将空白字符('\r'、'\n'、'\t' 等)加载到字符串中。如果您检查 的长度temp,由于末尾的空格,它可能与 的长度不同comp(如果我不得不猜测,我会说它可能是换行符)。

编辑:我忽略了循环 - 你不需要,第二次读取可能会设置 pgmFile.bad 标志(因为如果其中只有“P5”,第一次读取会读取整个文件)。

于 2013-09-19T19:55:44.453 回答
-3

似乎 std::string 的某些实现有一个 operator==() 可以成功比较,但这不是通用的,如std::string reference所示。

如果您的环境是这种情况,则适用以下情况:

这取决于您要测试的内容是否相等。temp 和 comp 是不同的字符串,因此在内存中具有不同的地址。简而言之,它们在这个意义上是不平等的。

您需要做的是比较字符串中的字符。String 有一个 compare() 函数来执行此操作,它将根据相关字符串返回 -1、0 或 1。

于 2013-09-19T19:58:44.383 回答