Сравнение строк со строками, созданными ifstream :: getline - PullRequest
1 голос
/ 24 января 2012

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

Ниже приведен фрагмент кода, который я написал для достижения этой цели.Я уверен, что в файле 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.

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

1 Ответ

1 голос
/ 24 января 2012

Измените 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...