2013-04-20 3 views
0
do { 
    getline (myfile,temp); 
    if (temp[0] != "="){ 
     MyAlbums[i].tracks.push_back(temp); 

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

дает мне эту ошибку:C++ работа вокруг сравнения между указателем и целым

ISO C++ запрещает сравнение между указателем и целым [-fpermissive]

я пытаюсь Переберите строки в текстовом файле и 'push_pack', если строка не начинается с символа равенства = =. иначе я хочу выйти из цикла.

Любая помощь очень пригодится!

ответ

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

должен быть

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

Причина заключается в том, что temp[0] имеет тип char (предположим, что temp является строка, которую вы читали в), вы должны сравнить его с полукокса буквального '=' не строкового литерала "=". Я предполагаю, что вы хорошо прочитали temp, поэтому вам может потребоваться проверить это, если это не так.

EDIT (спасибо Adam Liss)

строки литералов, как "=" имеют (const char *) типа, они заключены в двойные кавычки; отдельные символы заключены в одиночные кавычки. поэтому у вас есть, что компилировать жалобу сообщение об сравнении 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. 
+0

Уточнение (поскольку tacp продолжает редактировать свой ответ): строки (которые являются указателями на символы) заключены в двойные кавычки; отдельные символы заключены в одиночные кавычки. Следовательно, сообщение об ошибке жалуется на указатель. –

+0

@AdamLiss спасибо. что делало вещи еще лучше и яснее. – taocp

+0

Благодарим вас за чистый, прямой ответ. Это было очень полезно – user1082764

1

Во-первых, убедитесь, что getline удалось. не оценивать его в bool ЕАН контексте, чтобы понять это:

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 когда-либо дает вам string длины 0, то выполнение temp[0] приведет к неопределенному поведению. Неопределенное поведение действительно раздражает, чтобы отследить, потому что он может вести себя абсолютно безобидно в одной ситуации, а затем укусить вас в неожиданном месте позже.

В-третьих, сделать temp[0] != '=' вместо temp[0] != "=". '=' - символ, "=" - это буфер из 2-х символов, первый из которых - '=', второй - '\0'. Массив из двух символов, обозначенных "=", неявно преобразуется в указатель на первый символ, когда вы пытаетесь сделать !=, который затем генерирует ошибку (поскольку он не знает, как сравнить указатель на символ с символом).

Смежные вопросы