2012-01-24 4 views
1

Я работаю над проектом, где мне нужно прочитать постскриптум и проанализировать данные из файла для использования в моей программе. Я работаю над функцией, чтобы проверить, действителен ли постскрипт, убедившись, что у него есть открывающие и закрывающие разделители.Сравнение строк с строкой, созданной ifstream :: getline

Ниже приведен фрагмент кода, который я написал для этого. Я уверен, что в файле postscript нет дополнительных пространств или чего-либо подобного, чтобы вызвать расхождения между delimitStr и lineStr. Я также попытался установить delimitStr в "%%% BEGIN \ 0" и "%%% BEGIN", но сравнение никогда не работает.

string lineStr; 
bool beginFlag = false; //Switches to true when begin statement in postscript is found 
string delimitStr = "%%%BEGIN"; //Starts as opening delimiter. Switches to closing when opening is found. 
while(psfile) { 
    getline(psfile, lineStr); 
    if(!beginFlag && lineStr == delimitStr) { 
     beginFlag = true; 
     delimitStr = "%%%END"; 
     cerr << "Begin found." << endl; 
    } 
    else if(beginFlag && lineStr == delimitStr) 
     return true; //Only return true if file has beginning and ending delimiters. 

Любая помощь была бы принята с благодарностью.

+0

Примечание: Я также попытался сравнений lineStr и delimitStr с и без ".c_str) (" суффикс. – user1166271

+0

Идиомой правильной строки является 'while (std :: getline (psfile, lineStr)) {/*...*/}'. Ваш код отключен. Кроме того, строки не работают. –

+0

Я могу настроить эту строку кода, но она читает файл без проблем. Сравнение просто не работает. – user1166271

ответ

1

Изменение delimitStr в delimitStr = "%%%BEGIN"; потому что getline отбрасывает '\n' и сравнения строк, как эта lineStr == delimitStr. НЕ сравнивайте строки с c_str(), так как возвращает const char*.

Пример, показывающий различия:

std::string s1("%%%BEGIN"); 
std::string s2("%%%BEGIN\n"); 
std::string s3("%%%BEGIN\0"); // Same as s1 because std::string stops at '\0' 

std::cout << std::boolalpha << (s1 == s2) << '\n';  // Outputs: false 
std::cout << (s1 == s3) << '\n';  // Outputs: true 
std::cout << (s2 == s3) << std::endl; // Outputs: false 
+0

+1 Я не понял проблему с тем, как была определена строка. –

+0

Спасибо за это разъяснение, но по какой-то причине он все еще не работает. Я убедился, что в постскрипте не было лишних символов, заканчивающих строку, но по какой-то причине getline возвращает «%%% BEGIN», но lineStr.length() == 9, а delimitStr.length() == 8 – user1166271

+0

@ user1166271: Мое единственное предположение - у вас есть дополнительное пространство, попробуйте вывести строку на консоль, чтобы ее проверить. –

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