Чтение данных из текстового файла и игнорирование других

0

Для небольшой части моего проекта я должен извлечь данные из текстового файла, используя cin, который моя программа будет знать, где cin из аргументов командной строки. Моя проблема заключается в том, как извлечь четыре части данных и игнорировать запятые. Например, файл.txt будет выглядеть следующим образом:

(1,2,3,.)
(2,1,3,#)
(3,1,0,.)

В этом случае мне нужно извлечь 1, 2, 3 и. для первой строки. Затем перейдите ко второй строке. Когда будет достигнута пустая строка новой строки, я могу выйти из сценария getline() через цикл while.

Я знаю, что мне нужно использовать getline(), и мне удалось извлечь данные с помощью функции.at() строки, сгенерированной getline(). Однако я запутался, когда координата, такая как 1, 2 или 3, может быть двузначной. Когда это произошло, мой предыдущий алгоритм не работал, поэтому я чувствую, что переусердствую, и должен быть более простой способ проанализировать эти данные.

Благодарю!

Теги:
string
parsing
getline

2 ответа

-1
Лучший ответ

Простым подходом является использование sscanf, передача строки, которую вы читаете из cin, в качестве первого аргумента

sscanf(s, "(%d,%d,%d,%c)", &a, &b, &c))

Если вы хотите разобрать строку с нуля, просто сфокусируйте шаблон.

В этом случае шаблон

'(', number, ',', number, ',', number, ',', char, ')'

Таким образом, вы можете найти три запятые, а затем просто извлечь три числа из них.

Более сложным методом является регулярное выражение. Но C++ не имеет встроенной поддержки для этого (библиотека Boost)

  • 0
    поэтому для sscanf мне нужно s, чтобы быть верным cstring? У меня возникли проблемы с вызовом getline сейчас, когда я не использую строку
  • 0
    @JoshHamet да. char str[size]; cin.getline(str, size);
Показать ещё 1 комментарий
0

Вы можете просто использовать оператор >> для переменной "char" для чтения в разделителях. Это предполагает, что вам не нужен 4-й токен и что он всегда один символ:

char ch;
while (ss >> ch)
{
    int a,b,c;
    ss >> a >> ch >> b >> ch >> c >> ch >> ch >> ch;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню