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

Поиск:

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


Новичок



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

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



Привет. У меня дилема: 

Код

char fname;
cout <<"Plese enter the file name\n" <<endl;
cin >>fname;

string line;
  ifstream myfile (Что писать тут??); // открытие файла


Возможно ли так риализовать открытие файла, выбранного пользователем? Если да, то подскажите, пожалуйста, какой синтаксис или валидный код. Заранее спасибо!
PM MAIL   Вверх
anatox91
Дата 26.5.2008, 17:52 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



вроде так
Код

string name;
std::cout << "Please, enter the file name:" << std::endl;
std::cin >> name;

ifstream myfile(name.c_str());



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

The code is the design ©

Sony VAIO VGN-FW480J

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


Новичок



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

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



Спасибо, работает! Тему можно закрыть!
PM MAIL   Вверх
rrrFer
Дата 26.5.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Goodilla, 
Цитата

Возможно ли

так:?
Код

char cs[10];
cout<<"Plese enter the file name\n"<<endl;
cin >>cs;
ifstream inp(cs) ;

не успел smile
anatox91
извини за плагиат smile

Это сообщение отредактировал(а) rrrFer - 26.5.2008, 18:06
PM MAIL WWW ICQ   Вверх
Goodilla
Дата 26.5.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, это тоже возьму на заметку. А может вы ещё и парсить умеете? А то есть вопрос. 

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

Вопрос в том, как читать по символу? По строке так:

Код

while (! myfile.eof() )// проверка конца файла
    {
    getline (myfile,line); // читаем содеражание построчно

// пытался сделать здесь так:

char symbol;

line->symbol; 

//и после подключить модуль по обработке инфы на переменной symbol.
    cout << line << endl; // убираем не нужные символы
    }


Но что то не правильно, скорей чтение по символу

Это сообщение отредактировал(а) Goodilla - 26.5.2008, 18:17
PM MAIL   Вверх
anatox91
Дата 26.5.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



http://www.cplusplus.com/reference/iostream/istream/get.html
Цитата

istream& get ( char& c );
Extracts a character from the stream and stores it in c.



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

The code is the design ©

Sony VAIO VGN-FW480J

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


Новичок



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

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



Спасибо, сам роюсь на этом сайте, и никак не найти. То, что нужно!
PM MAIL   Вверх
Goodilla
Дата 26.5.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Извините, что так много вопросов. Но вот ещё небольшая проблемка. 

Задача: Удалить всё, что после символа.

Код

   if (s == symbol[3]) 
       {
            
       do
          {
          s = myfile.get(); 
          newfile <<" ";
          cout <<" ";
          }
          while (s == symbol[1]);
       }
       else
       {
           newfile << s;
           cout << s;
       }
    }


Проблема заключается в следующем, он не может перескочить через цикл - это логично, а следовательно он переключает символ только один раз, скажем со 2ого на третий. А также удаляет только их. Мне требуется, чтобы удалял все буквы или цифры от символа до символа. 
Для чего я использовал блог do while,  но этого мало. Что посоветуете. Кстати, хотел применить команду Delete, с синтаксисом проблемы.
PM MAIL   Вверх
bsa
Дата 27.5.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Goodilla, что-то ты не очень ясно выразился. Что значит "удалить все, что после символа"? Ты, судя по коду, не пытаешься удалять, а пытаешься менять на пробелы. Причем, цикл у тебя выполняется скорее всего только один раз, т.е. пока считанный из файла символ равен symbol[1]. Более того, а что ты будешь делать, когда достигнешь конца файла? Я не заметил выхода из цикла по этому условию.
PM   Вверх
Goodilla
Дата 27.5.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я имею ввиду следующее: Требуется удалить (хотя я заменяю на пробелы, кстати это ошибочно, тож сейчас понял) все содержимое между двумя символами а именно между и включая их </.....> вот так. Скажем 
было <transport></transport>, 
результат: transport  
или 
<transport></> результат: transport

Вот что то в этом роде. А до этого я заменяю пробелами для корректировки лесенки. Сорри за некоторые ошибки в коде. Там только кусок
PM MAIL   Вверх
rrrFer
Дата 27.5.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Goodilla, 
я могу посоветовать только писать символы в другой файл, а потом удалить старый файл и переименовать новый - так по-любому проще будет
PM MAIL WWW ICQ   Вверх
Goodilla
Дата 27.5.2008, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я так и делаю, вопрос не в том. Мне требуется не вписывать символы после определённого символа. Иными словами не вписывать содержимое после определённого символа, при каком то условии.

Пример:
Код


if (s == '[')
{
//сдесь требуется написать блог, который будет удалять все символы после символа в условии if, а
 //именно символа "[". Таким образом каждый последующий символ будет удалён, пока не достигнет 
//выполнения другого условия. Пример ниже.
}
  else
  {
  cout << s;
  }


Пример условия удаления:

Код

do
{
//сдесь именно то, что удалит символы между скобками и сами скобки
}while (s == ']')


Плохо объяснил, если да, скажите, попробую ещё раз поподробнее. Извините, за бестактно изложенные мысли.
PM MAIL   Вверх
rrrFer
Дата 27.5.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Goodilla
удалить что-то из середины файла не так просто...
потому я и посоветовал, что то вроде этого:
Код

while(s!='['){
//записываешь s в конец вспомогательного файла
    while(s!=']"){
        //чистаешь следующий символ
    }
      //чистаешь следующий символ
}


Это сообщение отредактировал(а) rrrFer - 27.5.2008, 19:36
PM MAIL WWW ICQ   Вверх
Goodilla
Дата 27.5.2008, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дело в том, что я считываю по символу в с одного файла, и после обработки записываю данный символ в другой файл. Если честно, то немного не понял вашу концепцию rrrFer. Если можно, то поподробнее.
PM MAIL   Вверх
bsa
Дата 27.5.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Goodilla, ты пишешь парсер XML что ли? Может готовый тебя устроит (tinyxml, например)?
А так с твоих слов не очень понятно, какой результат будет в случае, если файл содержит эти три строки:
Код
<transport name="train" cost="100">Some
text
message</transport>

PM   Вверх
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   Вверх
bsa
Дата 4.6.2008, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Твоя предпоследняя и последняя строки не удовлетворяют твоему ТЗ.
PM   Вверх
Goodilla
Дата 5.6.2008, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Никакой разницы, ответ: error: key not found
PM MAIL   Вверх
Goodilla
Дата 5.6.2008, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Люди, товарищи, человеки! Если есть у кого код полного ДОМ или САХ парсера ХМЛ файлов на С++, помогите! Не знаю что делать. Уже многое пробовал - результат не идёт. Помогите, если у кого есть готовый код, очень хочу разобраться. Заранее спасибо!
PM MAIL   Вверх
bsa
Дата 5.6.2008, 10:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Goodilla, я тебе разве уже не говорил посмотреть tinyXML?
http://sourceforge.net/project/showfiles.php?group_id=13559
PM   Вверх
xvr
Дата 5.6.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Goodilla @ 5.6.2008,  03:44)
Люди, товарищи, человеки! Если есть у кого код полного ДОМ или САХ парсера ХМЛ файлов на С++, помогите! Не знаю что делать. Уже многое пробовал - результат не идёт. Помогите, если у кого есть готовый код, очень хочу разобраться. Заранее спасибо!

http://xerces.apache.org/xerces-c/ (xerces)
http://xmlsoft.org/ (libxml2)

http://www.w3.org/XML/ & http://www.google.com/search?q=XML+parser

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


Новичок



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

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



Я уже сделал  такой, с применением библиотек. Теперь, говорят, что можно сделать и без них. Я вот хочу научиться, а то уже несколько раз делал, всё равно не получается. То не убрать закрывающий тег, то не убрать верхний тег <?xml....?>. Я уже не знаю что делать. Мне тут помогали, но всё либо не то, либо не работает.

Если можете, то помогите с кодом удаления строки тега: <?xml = "ISO2424"?>
и:</TITLE>

Иными словами, как удалить закрывающий тег </> и тег <??> с  содержимым внутри?

Это сообщение отредактировал(а) Goodilla - 5.6.2008, 19:16
PM MAIL   Вверх
anatox91
Дата 5.6.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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





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

The code is the design ©

Sony VAIO VGN-FW480J

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


Эксперт
****


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

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



Цитата(Goodilla @ 5.6.2008,  19:00)
Я уже сделал  такой, с применением библиотек. Теперь, говорят, что можно сделать и без них. Я вот хочу научиться, а то уже несколько раз делал, всё равно не получается. То не убрать закрывающий тег, то не убрать верхний тег <?xml....?>. Я уже не знаю что делать. Мне тут помогали, но всё либо не то, либо не работает.

Если можете, то помогите с кодом удаления строки тега: <?xml = "ISO2424"?>
и:</TITLE>

Иными словами, как удалить закрывающий тег </> и тег <??> с  содержимым внутри?

Изначально неправильный подход - библиотеки не пытаются удалять что либо из xml текста что бы получить нечто, они РАЗБИРАЮТ структуру xml на составляющие части и работают с ними, а не с исходным текстом. SAX парсер с этой точки зрения наиболее простой, его базовая реализация займет не более 100 строк.

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


Новичок



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

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



Спасибо, anatox91!!

Спасибо, xvr! Я и не говорил, что библиотеки парсят, но ведь можно же без них обойтись?

Скажите, вот команда: streambuf::snextc

Можно ли её использовать как передвижение курсора с символа на символ? Вроде работает, но мне нужен переход в цикле while. Заранее спасибо

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


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


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

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



можно
смотри: streambuf::snextc сначала инкрементирует указатель, а затем возвращает следующий символ, а streambuf::sbumpc сначала получает символ, а затем инкрементирует указатель(удобнее конечно ее использовать)
пример с cplusplus.com:
Код

#include <iostream>
#include <fstream>
using namespace std;

int main () {

  char ch;
  streambuf * pbuf;
  ifstream istr ("test.txt");

  pbuf = istr.rdbuf();

  do {
     ch=pbuf->sgetc(); //для получения символа (sgetc() только получает текущий символ и больше ничего не делает)
     cout << ch;
  } while (pbuf->snextc()!=EOF); //а вот snextc() уже используется для перемещения по файлу и сравнения следующего символа с концом файла

  istr.close();

  return 0;
}

еще: rdbuf() используется для получения указателя на буфер, а in_avail() для получения  количества символов в буфере. Так что если использовать std::string то вполне реально реализовать  smile 

Это сообщение отредактировал(а) anatox91 - 6.6.2008, 07:49


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

The code is the design ©

Sony VAIO VGN-FW480J

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


Опытный
**


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

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



При чтении из файла строй структуру "дерево", а для выделения данных воспользуйся регулярными выражениями (они для этого как раз и предназначены).

например boost::regex



--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
Goodilla
Дата 6.6.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Это уже не требуется, спасибо. Скажите, а можно ли реализовать нахождения тега через getline();
PM MAIL   Вверх
anatox91
Дата 6.6.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



можно получать строку до какого-то символа, который передается параметром delim (хотя я по-моему уже об этом говорил)
Код

istream& getline (char* s, streamsize n, char delim);


Это сообщение отредактировал(а) anatox91 - 6.6.2008, 14:34


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

The code is the design ©

Sony VAIO VGN-FW480J

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


Новичок



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

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



Мде, не подходит. Надо сортировать, а я не то начал делать. Потом переделаю, поможете подкорректировать?
PM MAIL   Вверх
Goodilla
Дата 8.6.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет, требуется опять помощь. Извините за такой объём вопросов.

Код

char name_file[81]="";
char stroka[134]="";//pustoi
int zakr_teg=0;//kol-vo zakr. tegov
int otkr_teg=0;
int obseje_teg=0;//kol-vo otkr. tegov
int mense=0;//<
int bolse=0;//>
int k=0, i=0;
int nomer_stroki=0;
//char bolshe='>';
//char menshe='<';
int bolshe=0;
int menshe=0;

void proverka()
{
     printf("statistika\n");
     while(!feof(in))//otkritije zikla, poka netu konza faila
     {
      
      
      fgets( stroka,133,in);//4t0bi 4itat postro4no
      nomer_stroki++;
      //printf("%d nomer stroki \n", nomer_stroki);
      mense=0;
      bolse=0;  
    for(k=0;k<=strlen(stroka);k++)
      {
          /*for(i=0;i<strlen(stroka);i++)
          {
             if(stroka[k]== bolshe && stroka[i]== menshe) printf("pravilno %c %c\n", stroka[k], stroka[i]);
            // else //break;//
            // printf("nepravilno %d", nomer_stroki);
          }*/
       
          
          if(stroka[k]=='<' && stroka[k+1]=='/') zakr_teg++;
          if(stroka[k]=='<' && stroka[k+1]!='/') otkr_teg++;
          if(stroka[k]=='<') menshe++; 
          if(stroka[k]=='>') bolshe++;
          if(stroka[k]=='<') mense++; 
          if(stroka[k]=='>') bolse++;  
          // 
      }
      if(mense!=bolse && mense<bolse)
                      printf("ots znak < v stroke %d\n", nomer_stroki);
      if(mense!=bolse && mense>bolse)
                      printf("ots znak > v stroke %d\n", nomer_stroki);
      
     }
     
             //obseje_teg=mense;
             
            
             
             if((otkr_teg-1)==zakr_teg && bolshe==menshe)
             {
                             printf("%d otkryv koli4estvo tegov\n", otkr_teg-1);
                             printf("%d kol-vo naidennih zakr. tegov\n", zakr_teg);
                        //     printf("%d kol-vo naiennih otkr. tegov\n", mense/2);
                             printf("Pravilno!!!!!!!!");
                             }
             else
             {
                 printf("nepravilno!!! \n");
                 if(otkr_teg-1<zakr_teg)
                      printf("net otkr tega \n");
                 if(otkr_teg-1>zakr_teg)
                      printf("net zakr tega\n"); 
             } 


Ситуация: Я хочу убрать это из главного кода, и поместить в файл .h, сделать как дополнительную функцию (void proverka(void)), которая будет вызываться в главный файл(platform.cpp) при необходимости. Вставка proverka(); в корневой код.

Проблема: Пишет, что не найти файл, который проверять надо + ещё проблемы с переменными. Оно то и правильно, ведь он не находиться в гланом коде.

Вопросы: Скажите, возможно ли реализовать поставленную задачу, если да, то как? Или это очень неудобно и долго? Заранее спасибо.

Это сообщение отредактировал(а) Goodilla - 8.6.2008, 19:37
PM MAIL   Вверх
mes
Дата 8.6.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Goodilla @  8.6.2008,  19:34 Найти цитируемый пост)
Я хочу убрать это из главного кода, и поместить в файл .h, сделать как дополнительную функцию...
Пишет, что не найти файл, который проверять надо + ещё проблемы с переменными.  

ну так надо передавать  ссылки на эти переменные в функцию.
если переменных много, а также много функций которые их используют, то можно
создать контекст - структуру , в которой собраны все нужные переменые - и ее передавать в функцию



Это сообщение отредактировал(а) mes - 8.6.2008, 19:55


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


Новичок



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

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



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

Код

int main () 
{
owner();
std::string name; //Запрашиваем имя файла
std::cout << "Please, enter the file name:" << std::endl;
std::cin >> name;

std::cout <<"\n";

std::ifstream myfile(name.c_str());//Открываем файл


после чего, хочу вставить код, кстати, я переделал тот код под С++.

Вот именно ссылка на файл меня и мучает, на файл name.c_str() с именем. Вот.

И ещё вопрос, а как можно реализовать сортировку чего - либо по категориям и по дате, ищя  инфу в файле?

Это сообщение отредактировал(а) Goodilla - 8.6.2008, 21:17
PM MAIL   Вверх
bsa
Дата 9.6.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Goodilla @ 8.6.2008,  20:15)
И ещё вопрос, а как можно реализовать сортировку чего - либо по категориям и по дате, ищя  инфу в файле?

Во-первых, одна тема - один вопрос.
Во-вторых, чтобы получить ответ на свой вопрос, надо задать вопрос корректно (см. мою подпись). Пока что можно ответить только с помощью std::sort с указанием предиката сравнения.
PM   Вверх
Goodilla
Дата 9.6.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Извините, просто не хотел создавать много тем. А во-вторых, тема то у меня обширная, значит топик многофункциональный. Спасибо за замечание и совет!
PM MAIL   Вверх
bsa
Дата 9.6.2008, 16:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Goodilla, тема у тебя зовется "один вопрос по файлам". А на самом деле обсуждение ведется темы "как написать собственных парсер XML". Разницу чувствуешь?
PM   Вверх
Goodilla
Дата 9.6.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, я уже извинился. Но мы не писали парсер. Только помощь. Сорри за флуд!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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