![]() |
Помогите написать парсер для текстового документа!!!
Нужно написать парсер, который открывает текстовый файл, считывает побайтно содержимое и если в тесте попадается знак $ переводит на новую строку т.е.
____________ привет$$089Пока //Исходная строка привет //Должны получить $$089Пока ____________ void CParserDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here CFileDialog dlg(TRUE,"txt", "*.txt"); if (dlg.DoModal()==IDOK) { CFile myFile; VERIFY(myFile.Open(dlg.GetPathName(), CFile::modeReadWrite)); char buffer[1024]={0}; //буфер куда читаем } } int counter=0; //счетчик для побайтового смещения при поиске //строки откуда начинать читать значения myFile.Seek(0,CFile::begin); //стали в начало файла do //Ищем откуда начать чтение данных { try { myFile.Seek(counter++,CFile::begin); //Пробуем переместиться в файле } catch (...) { //не получилось переместиться - ругаемся myFile.Close(); MessageBox("Стартовая строка не найдена"); return; } //чистим буфер для чтения из файла memset(buffer,0,sizeof(buffer)); if (myFile.Read(buffer,strlen(0))==0) {//если ничего не смогли прочитать myFile.Close(); MessageBox("Файл битый"); return; //уходим } } ___________________________ Я пока начинающий! Подскажите если кто знает пожалуйста! |
Ответ: Помогите написать парсер для текстового документа!!!
Для этой задачи достаточно прочитать весь текст в буфер, а потом все знаки $ заменить на \n$ (естественно каждый раз сдвигая остальной текст на 1 символ). Если знаком $ можно пожертвовать, то просто меняем его на \n
|
Ответ: Помогите написать парсер для текстового документа!!!
Пример некорректный.
В ответ на "привет$$089Пока" должны получить: ================= привет $ $089Пока ================= А вообще, такие проблемы просто решаются скриптовыми языками: Python: s=s.replace('$', '\n$') |
Ответ: Помогите написать парсер для текстового документа!!!
Для данного конкретного случая - то, что сказал ZSS, но с некоторой поправкой - не надо ничего сдвигать, просто буфер сканируется, и посимвольно пишется в результирующий файл, если встречается символ '$', то в файл пишется дополнительный '\n'. Поскольку текст уже в буфере, то писать можно в исходный файл (хотя более правильно писать во временный файл, а потом его переименовать, это исключает потерю данных при сбое во время записи).
Для более сложного случая использовать сканер - lex / flex (это классика). Для парсинга вообще lex+yacc (классика) либо средства библиотеки boost. |
| Текущее время: 14:19. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Copyright ©2004 - 2025 NoWa.cc