0
do {
    getline (myfile,temp);
    if (temp[0] != "="){
        MyAlbums[i].tracks.push_back(temp);

    }
    else {
        break;
    }
}while(true);

给我这个错误:

ISO C++ 禁止指针和整数之间的比较 [-fpermissive]

如果该行不以“=”等于字符开头,我正在尝试遍历文本文件中的行和“push_pack”。否则我想跳出循环。

非常感谢任何帮助!

4

2 回答 2

6
if (temp[0] != "="){

应该

if (temp[0] != '='){

原因是它temp[0]的类型char(假设temp是您读入的字符串),您应该将其与 char literal'='而不是 string literal进行比较"="。我假设您已temp成功阅读,因此如果不是这种情况,您可能需要检查一下。

编辑(感谢亚当利斯)

"="像( ) 类型的字符串文字const char *,它们用双引号括起来;单个字符用单引号括起来。因此,您会收到关于将char(char 文字是整数) 与const char *.

从这里引用:IBM C++ 文档

C  A character literal has type int.
C++ A character literal that contains only one character has type char, 
which is an integral type.
于 2013-04-20T01:29:08.820 回答
1

首先,确保getline成功。在 ean 上下文中对其进行评估bool以找出答案:

while (getline(myfile, temp)) {
  /* code goes here */
}

代替

do {
  getline(myfile, temp);
  /* code goes here */
} while (true);

永远,永远不要在不检查它是否立即失败的情况下进行输入,否则你会得到非常烦人的错误来追踪。

其次,确保temp至少有 1 个字符长。 如果这样做是安全的,将temp.size() >= 1是。如果曾经给你一个长度为 0 的值,那么对它进行操作将导致未定义的行为。追踪未定义的行为真的很烦人,因为它可以在一种情况下表现得完全无害,然后在一个意想不到的地方咬你。truetemp[0]getlinestringtemp[0]

第三,做temp[0] != '='而不是temp[0] != "="'='是一个字符,"="是 2 个字符的缓冲区,第一个是'='第二个是'\0'. "="当您尝试 do 时,由 表示的两个字符的数组隐式转换为指向第一个字符的指针!=,然后生成错误(因为它不知道如何将指向字符的指针与字符进行比较)。

于 2013-04-20T01:30:21.483 回答