do {
getline (myfile,temp);
if (temp[0] != "="){
MyAlbums[i].tracks.push_back(temp);
}
else {
break;
}
}while(true);
给了我这个错误:
ISO C ++禁止指针和整数[-fpermissive]
之间的比较我试图循环文本文件中的行和'push_pack',如果该行不以“=”等于字符开头。否则我想摆脱循环。
任何帮助都非常适用!
答案 0 :(得分:6)
if (temp[0] != "="){
应该是
if (temp[0] != '='){
原因是temp[0]
的类型为char
(假设temp
是您读入的字符串),您应该将它与字符'='
进行比较而不是字符串文字"="
。我假设您已成功阅读temp
,因此如果不是这样,您可能需要检查一下。
编辑(感谢Adam Liss)
字符串文字(如"="
)属于(const char *
)类型,它们用双引号括起来;单个字符用单引号括起来。因此,您有关于将char
(字面值为整数)与const char *
进行比较的编译抱怨消息。
从这里引用:IBM C++ documentation
C A character literal has type int.
C++ A character literal that contains only one character has type char,
which is an integral type.
答案 1 :(得分:1)
首先,确保getline
成功。在bool
ean上下文中对其进行评估,以确定结果:
while (getline(myfile, temp)) {
/* code goes here */
}
而不是
do {
getline(myfile, temp);
/* code goes here */
} while (true);
永远不要在没有检查它是否立即失败的情况下进行输入,否则你将会遇到非常烦人的错误。
其次,确保temp
长度至少为1个字符。如果temp.size() >= 1
安全,true
将为temp[0]
。如果getline
曾为您提供长度为0的string
,则对其执行temp[0]
将导致未定义的行为。未定义的行为对于追踪非常烦人,因为在某种情况下它可能表现得完全无害,然后在一个意想不到的地方咬你。
第三,做temp[0] != '='
而不是temp[0] != "="
。 '='
是一个字符,"="
是2个字符的缓冲区,第一个是'='
,第二个是'\0'
。当您尝试执行"="
时,由!=
表示的两个字符的数组被隐式转换为指向第一个字符的指针,然后生成错误(因为它不知道如何将指针与角色的角色。)