На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Копирование\перенос содежимое файла в список std::list
    Всем доброй ночи и с праздником.

    OC:Windows 7
    Компилятор : Visual Studio C++(win32).

    Вопрос как перенести \копировать содержимое файла в список std::list.

    Пишу такую функцию
    ExpandedWrap disabled
      void LoadFromFile(LPCSTR fileName)
      {
          std::list<std::string> foo;
          std::list<std::string>::iterator it;
          std::string stroka;
          std::ifstream fin;
       
       //  Открываем файл для обработки
         fin.open(fileName);
         if(fin.fail())
         {
            MessageBoxA(0,"не удалось открыть ",fileName, MB_OK);
            exit(1);
         }
       
        
         char next;
       
        do
         {
            fin.get(next);
            
            stroka +=next;
       
         }while(!fin.eof());
         foo.push_back(stroka);
      //Вывожу список через мессаге
      for (it=foo.begin(); it!=foo.end(); it++)
      {
          stroka = *it;
          MessageBoxA(0,stroka.c_str(),fileName, MB_OK);
      }
         fin.close();
      }


    не достаток этого метода, он переносит весь файл в одной строке, т.е. индекс всегда равен 0 (первая строка)

    ExpandedWrap disabled
      void LoadFromFile(LPCSTR fileName)
      {
          std::list<std::string> foo;
          std::list<std::string>::iterator it;
          std::string stroka;
          std::ifstream fin;
       
       //  Открываем файл для обработки
         fin.open(fileName);
         if(fin.fail())
         {
            MessageBoxA(0,"не удалось открыть ",fileName, MB_OK);
            exit(1);
         }
       
        
         char next;
       do
       {
            fin.get(next);
       
            if(next != '\n')
               stroka +=next;
            else
            {
               stroka +=next;
                foo.push_back(stroka);
             }
         }while(!fin.eof());
      //Вывожу список через мессаге
      for (it=foo.begin(); it!=foo.end(); it++)
      {
          stroka = *it;
          MessageBoxA(0,stroka.c_str(),fileName, MB_OK);
      }
         fin.close();
      }

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

    Добавлено
    Компилятор : Visual Studio 8 C++(win32).
      ExpandedWrap disabled
         std::string line;
            std::list<std::string> lines;
            while( getline( file, line ) )
        {
        lines.push_back( line );
        }
        Painkiller
        Выдает ошибку
        ExpandedWrap disabled
          1>.\formWin32.cpp(252) : error C2589: }: недопустимая лексема справа от '::'
          1>.\formWin32.cpp(252) : error C2143: синтаксическая ошибка: отсутствие ";" перед "::"


        Вот функция
        ExpandedWrap disabled
          void LoadFromFile(LPCSTR fileName)
          {
              std::list<std::string> foo;
              std::list<std::string>::iterator it;
              std::string stroka;
              std::ifstream fin;
           
           //  Открываем файл для обработки
             fin.open(fileName);
             if(fin.fail())
             {
                MessageBoxA(0,"не удалось открыть ",fileName, MB_OK);
                exit(1);
             }
            
             while(std::getline(fin,stroka))
             {
                 foo.push_back(stroka);
             }
          for (it=foo.begin(); it!=foo.end(); it++)
          {
              stroka = *it;
              MessageBoxA(0,stroka.c_str(),fileName, MB_OK);
          }
             fin.close();
            
           
          }
          инклюдов не хватает
            ExpandedWrap disabled
              #include <iostream>
              #include <fstream>
              #include <list>
            Сообщение отредактировано: Painkiller -
              Спасибо. Вопрос решен.
                Но возникла вторая прболемаю
                Как узнать кодировку файла, при вставке его в буфер?
                А то я открыл файл, а там крякозябры. Пришлось вручную перекодировать файл в АНСИ, а потом открывать. И стало работать норм.
                  Если можно подскажите в каком направление идти.
                    Точно узнать кодировку не получится. Можно только пытаться угадать. Делает это, например, библиотека ICU. По-хорошему, если ты работаешь с текстовыми файлами с кодировкой, то тебе должны предоставить о ней инфу, а не ты ее угадывать.
                      Цитата PropellerMan @
                      По-хорошему, если ты работаешь с текстовыми файлами с кодировкой, то тебе должны предоставить о ней инфу, а не ты ее угадывать.

                      Просто я пишу парсеры, по логам, сторонних утилит, и у некоторых кодировка разная. А информацию, мне конечно ни кто не дает.
                        Aibolit Никак, у xml информация о кодировке содержится в хидере.
                          Цитата Painkiller @
                          Aibolit Никак, у xml информация о кодировке содержится в хидере.

                          Я обычные текстовые файлы, обрабатываю.

                          P.S. Интересно, а когда VSC++ перейдет на обработку, всех кодировок. Embarkadero давно уже поддерживает, практически все коироки.
                            Цитата
                            P.S. Интересно, а когда VSC++ перейдет на обработку, всех кодировок.

                            libiconv?
                              Цитата Aibolit @
                              Интересно, а когда VSC++ перейдет на обработку, всех кодировок.
                              Где-то так году в 2000-м. Если ты застрял где-то в прошлом.
                                ExpandedWrap disabled
                                  struct line : public std::string {};
                                  std::istream& operator>> (std::istream& is, line& l) {  
                                   return std::getline(is, l);
                                  }
                                   
                                  void LoadFromFile(LPCSTR fileName) {
                                    std::list<std::string> strlist;
                                    std::ifstream in;
                                    ...
                                    std::copy (std::istream_iterator<line>(in), std::istream_iterator<line>(), std::back_inserter(strlist));
                                  }
                                Сообщение отредактировано: liss -
                                  Цитата trainer @
                                  Где-то так году в 2000-м. Если ты застрял где-то в прошлом.


                                  До этого я в Борланде программировал. Недели 2 перешел на VSC++.
                                  В борланде когда обрабатывал данный лог, он обработался без проблем. Я даже и не знал, что там кодировка другая.
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0.1016 ]   [ 16 queries used ]   [ Generated: 10.07.26, 13:13 GMT ]