Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Один вопрос по файлам, Как лучше сделать (синтаксис) 
V
    Опции темы
Goodilla
Дата 27.5.2008, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.10.2007

Репутация: 1
Всего: 1



bsa, да парсер, только без применения библиотек.

Результат, на данном этапе готовности программы следующий:

 transport name="train" cost="100" Some
text
message   ransport
PM MAIL   Вверх
bsa
Дата 27.5.2008, 22:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Goodilla, ну и что тебе даст этот результат? Думаю, дальше ты упрешься и все.

Думаю, тебе стоит хорошенько обдумать, как вообще парсить. А еще лучше, посмотреть, как это делают другие.
PM   Вверх
Goodilla
Дата 28.5.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.10.2007

Репутация: 1
Всего: 1



Логично, а где? Кстати, Что лучше ДОМ - парсинг или САХ парсинг?
PM MAIL   Вверх
bsa
Дата 28.5.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Goodilla, набери в гугле tinyxml, expat, libxml, qt...
PM   Вверх
xvr
Дата 29.5.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Goodilla @ 28.5.2008,  18:56)
Логично, а где? Кстати, Что лучше ДОМ - парсинг или САХ парсинг?

Если размер обрабатываемого файла относительно небольшой - то DOM, если же очень большой (мегабайты и более) - SAX

PM MAIL   Вверх
bsa
Дата 29.5.2008, 16:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(xvr @ 29.5.2008,  15:38)
Если размер обрабатываемого файла относительно небольшой - то DOM, если же очень большой (мегабайты и более) - SAX

Я так понял, критерий другой: http://developerlife.com/tutorials/?p=28
PM   Вверх
xvr
Дата 30.5.2008, 10:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(bsa @ 29.5.2008,  16:31)
Цитата(xvr @ 29.5.2008,  15:38)
Если размер обрабатываемого файла относительно небольшой - то DOM, если же очень большой (мегабайты и более) - SAX

Я так понял, критерий другой: http://developerlife.com/tutorials/?p=28

Я так понял, что по поводу предпочтительности использования SAX там написан полный бред - все, что там описано гораздо проще реализуется на DOM. ЕДИНСТВЕННОЕ преимущество SAX -это то, что он не хранит все дерево xml документа в памяти. Что касается возможности построения своих собственных моделей хранения данных на SAX (о чем было сказано по ссылке), то это притянуто за уши - и SAX и DOM повторяют модель xml языка (дерево), только DOM строит ее явно в виде структуры данных, а SAX неявно в виде последовательности вызовов эвентов. Обход дерева после DOM даст тот же самый эффект, что и SAX парсер. Сериализация любых структур данных может быть с легкостью написана и на DOM и на SAX. DOM даст меньший и более простой код за счет большего объема памяти и проигрыша в скорости, SAX наоборот - меньше памяти и больше скорости за счет большего объема более сложного кода.

PM MAIL   Вверх
Goodilla
Дата 1.6.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.10.2007

Репутация: 1
Всего: 1



Спасиб ребят, вопрос закрыт. Помощь получил, ошибки осознал. Конечно помощь не том размере, что я хотел, но всё же бооольшое спасибо! Сейчас буду переделывать программу третий раз.
PM MAIL   Вверх
Goodilla
Дата 2.6.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.10.2007

Репутация: 1
Всего: 1



Требуется ещё помощь.

Не могу разобраться в синтаксисе написания следующего:

basic_istream& get (char_type* s, streamsize n, char_type delim );

Мне требуется читать файл по символу, до определённого символа.

char_type delim - что писать здесь, а точнее как, если символ прерывающий чтение есть '>'

streamsize n - длина чего?

char_type* s - это переменная строки или ???

Помогите, пожалуйста. Заранее спасибо!
PM MAIL   Вверх
anatox91
Дата 2.6.2008, 20:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: 1
Всего: 13



Цитата

istream& get (char* s, streamsize n );
Extracts characters from the stream and stores them as a c-string into the array beginning at s. Characters are extracted until either (n - 1) characters have been extracted or the delimiting character '\n' is found. The extraction also stops if the end of file is reached in the input sequence or if an error occurs during the input operation.
If the delimiting character is found, it is not extracted from the input sequence and remains as the next character to be extracted. Use getline if you want this character to be extracted (and discarded).
The ending null character that signals the end of a c-string is automatically appended at the end of the content stored in s.
istream& get (char* s, streamsize n, char delim ); 
Same as above, except that the delimiting character is the one specified indelim instead of '\n'.

по-русски объяснил в личке



Это сообщение отредактировал(а) anatox91 - 2.6.2008, 20:41


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Goodilla
Дата 3.6.2008, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.10.2007

Репутация: 1
Всего: 1



Не знаю что делать, всё перепробовал. Не переходит на следующий символ в строке, хоть убей. Что я не правильно сделал, не пойму.  smile 

Как мне сделать, какой код с применением streambuf::snextc будет валидным, чтобы результат был такой:

Вначале:

<TITLE>Hello world!</TITLE>

После обработки: 

TITLE Hello world!

Я в отчаине, не знаю что применить.  smile  буду благодарен! 
PM MAIL   Вверх
bsa
Дата 3.6.2008, 12:21 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Как-то так:
Код
std::string line;
std::getline(std::cin, line); //читаем строку
std::string::size_type pos = line.find('<');
if (pos != std::string::npos) {
   std::string::size_type pos2 = line.find('>', ++pos);
   if (pos2 != std::string::npos) {
       std::string key = line.substr(pos, pos2++);
       std::cout << key << ' ';
       pos = line.find("</" + key + ">", pos2);
       if (pos != std::string::npos) {
           std::cout << line.substr(pos2, pos) << std::endl;
       } else
          std::cerr << "error" << std::endl;
   } else
       std::cerr << "error" << std::endl;
} else
   std::cerr << "error" << std::endl;

PM   Вверх
Goodilla
Дата 4.6.2008, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.10.2007

Репутация: 1
Всего: 1



Выдаёт ошибку после прохождения первого цикла:

Код


std::string line;
std::getline(std::cin, line); //читаем строку
std::string::size_type pos = line.find('<');

if (pos != std::string::npos) { - вот тут
Код

   std::string::size_type pos2 = line.find('>', ++pos);
   if (pos2 != std::string::npos) {
       std::string key = line.substr(pos, pos2++);
       std::cout << key << ' ';
       pos = line.find("</" + key + ">", pos2);
       if (pos != std::string::npos) {
           std::cout << line.substr(pos2, pos) << std::endl;
       } else
          std::cerr << "error" << std::endl;
   } else
       std::cerr << "error" << std::endl;
} else
   std::cerr << "error" << std::endl;


При чтении любого хмл файла выдаёт ошибку на первом блоке if. Результат всегда: error
Возможно, он по какой то причине не может выполнить эту команду: std::string::size_type pos = line.find('<'); и найти символ "<". Что надо подкорректировать?

Это сообщение отредактировал(а) Goodilla - 4.6.2008, 20:45
PM MAIL   Вверх
bsa
Дата 4.6.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Он выдавал ошибку не на первом блоке, а на третьем! Учись отлаживаться.
Код
#include <iostream>
#include <string>

int main()
{
        std::string line;
        std::getline(std::cin, line); //читаем строку
        std::string::size_type pos = line.find('<');
        if (pos != std::string::npos) {
           std::string::size_type pos2 = line.find('>', ++pos);
           if (pos2 != std::string::npos) {
               std::string key = line.substr(pos, pos2++ - pos);
               std::cout << key << ' ';
               pos = line.find("</" + key + ">", pos2);
               if (pos != std::string::npos) {
                   std::cout << line.substr(pos2, pos - pos2) << std::endl;
               } else
                  std::cerr << "error: closing key not found" << std::endl;
           } else
               std::cerr << "error: closing bracket not found" << std::endl;
        } else
           std::cerr << "error: key not found" << std::endl;
        return 0;
}

PM   Вверх
Goodilla
Дата 4.6.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.10.2007

Репутация: 1
Всего: 1



Выдавал то да, а вот условие было на первом if- или я опять не прав. Да, я ещё только учусь. Спасиб!

Но проблемка осталась, выдаёт ошибку: Key not found на такой файл:

<Author>Gambardella, Matthew</Author>
      <Title>XML Developer's Guide</Title>
      <Genre>Computer</Genre>
      <Price>44.95</Price>
      <Publish_date>2000-10-01</Publish_date>
      <Description>An in-depth look at creating applications 
      with XML.</Description>

Не найти символ "<"

Это сообщение отредактировал(а) Goodilla - 4.6.2008, 21:21
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.