2015-10-15 3 views
2
bool validateCurrencyLine(string line){ 
    cout << "TESTING LINE : " << line << endl; 
    string pattern = "[ ]*([A-Z]{3}) ([0-9]+)([ ]*|,[0-9]+[ ]*)"; 
    boost::regex expr{pattern}; 
    return boost::regex_match(line,expr); 
} 

int main() 
{ 
    string line; 
    while(getline(cin,line)){ 
     cout << validateCurrencyLine(line) << endl; 
    } 
    return 0; 
} 

Содержание test файла выглядит следующим образом:другой результат от чтения файла и стандартного ввода с GetLine

ИДК 3453443

Теперь, когда я начала программу с помощью ./a.out < test результат

TESTING LINE : IDK 3453443 
0 
TESTING LINE : 
0 

Мое предположение заключается в том, что вторая строка печатается, так как TestFile первая линия на самом деле

ИДК 3453443 + введите

Я правильно)

Но реальная проблема заключается в том, что, когда я начинаю это так: ./a.out и введите «IDK 3453443» и нажмите enter. Результатом этого является:

TESTING LINE : IDK 3453443 
1 

Любые мысли, почему эти два результата отличаются?

+0

Уверены ли вы, что у вас нет '\ r' перед' \ n' в файле? Это может быть виновником ... Попробуйте 'string pattern =" [] * ([AZ] {3}) ([0-9] +) ([] * |, [0-9] + \\ s *) «;'. Или 'regex_search' вместо' regex_match'. –

+0

К сожалению, новый шаблон все еще не работает @стрибижев – user3142434

ответ

0

Действительно, концы линий являются виновниками.

Посмотрите на файл в шестнадцатеричном редакторе, вы найдете 0d 0a конец строки (Windows или CRLF), где код ожидает UNIX-концы (только LF).

Смотрите вживую:

Live On Coliru

Вы можете работать вокруг него 'ест' все пробелы в конце:

Live On Coliru

std::string pattern = "[ ]*([A-Z]{3}) ([0-9]+)(,[0-9]+)?\\s*"; 

Теперь оба принимаются.

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