Какой лучший, кросс-платформенный, способ разбора текстового файла? - PullRequest
0 голосов
/ 31 октября 2011

Я хотел бы перенести мой код Windows на собственный C ++ и мне нужно избавиться от всего кода CLI. Я нашел .NET очень полезным при разборе текстового ввода, но когда я начал переписывать его на C ++, я все еще не привык писать код на C с fseek и char * вместо String. Поиск C ++ имеет тип string в пространстве имен std. Я открыл свою документацию STL (из zip-архива) и обнаружил "string_discussion.html" , который начинался с "Strings in SGI STL" и продолжался описать недосмотр, потенциально вызывающий периодические ошибки.

Безопасно ли std::string? Каковы отношения std к STL, если таковые имеются? Является ли C-файл IO , который опасным, и C ++ для потоковых и строковых операций ввода-вывода намного лучше?

1 Ответ

2 голосов
/ 31 октября 2011

Проблемы, описанные в документе, существуют для некоторых компиляторов, особенно для MSVC, но я никогда не сталкивался с реальной проблемой в реальном мире. Компиляторы GNU реализуют описанные строки «не для обмена», то есть использование неконстантных operator[] делает строку недоступной для обмена и создает копию при необходимости.

Классы STL по определению не являются потокобезопасными и должны быть окружены блокировками при доступе из нескольких потоков; Я думаю, что это особенность, поскольку она делает их значительно быстрее и позволяет реализовать алгоритмы без блокировок.

Отношение между std и STL в основном состоит в том, что STL был интегрирован в стандартную библиотеку C ++, которая находится в пространстве имен std. С тех пор стандарт развился, но остается в значительной степени совместимым.

В целом это безопасно для использования в текстовых парсерах: типичный шаблон для построчного разбора -

std::istream &is;
for(std::string line; getline(is, line);)
{
    // parse line
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...