Как читать сложные текстовые файлы в C ++? - PullRequest
1 голос
/ 21 февраля 2012

Текстовый файл I для чтения имеет определенный шаблон:

Name line [tag name 452,54 | tag2 name 323,2 | tag3 name 252,25 ... ]
Name2 line [tag name 422,54 | tag2 name 33,2 | tag3 name 111,525 | tag4 name 222,2 ... ]

Самая хлопотная часть работы с этим файлом - количество тегов в каждой строке не установлено.

Я пытался заставить его работать, читая файл построчно и разбивая строки на переменные, используя scanf(), потому что это казалось хорошим для чтения шаблонов. Но tag name количество слов не установлено, так что это тоже не сильно помогло.

Я могу немного манипулировать шаблоном файла без потери данных, чтобы его было легче читать, но ни одно решение не пришло мне в голову. Примеры того, как я могу манипулировать шаблоном файла:

Name line 
tag name 452,54 | tag2 name 323,2 | tag3 name 252,25 ... 
Name2 line 
tag name 422,54 | tag2 name 33,2 | tag3 name 111,525 | tag4 name 222,2 ... 

Я добавил символы [] и | в качестве разделителей, но в идеале чем меньше их, тем лучше.

Name line 
tag name 452,54 
tag2 name 323,2
tag3 name 252,25 ... 
Name2 line 
tag name 422,54
tag2 name 33,2
tag3 name 111,525
tag4 name 222,2 ... 

Если вы читали с похожими образцами, пожалуйста, поделитесь. Я немного застрял сейчас ...

РЕДАКТИРОВАТЬ: Это простой файл .txt, и я выбрал tags name и name line в качестве замены для любого строкового значения. Там нет идентификатора или что-то еще, чтобы сделать это легко.

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

Похоже, вы ищете парсер .В сети их много.:) Даже lex / yacc или бизон или что-то может помочь.

1 голос
/ 21 февраля 2012

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

Я предпочитаю Boost.Spirit для таких задач.

0 голосов
/ 22 февраля 2012

Если вам действительно нужно написать собственный код и поддерживать новую строку, чтобы иметь особое значение разделения тегов, вы можете использовать комбинацию fgets () и strtok (). http://www.cplusplus.com/reference/clibrary/cstring/strtok/

...