На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> сортировка по алфавиту в файле
    Люди!Помогите решить задачу, pliz!!
    Отсортировать по алфавиту список городов, которые считываются из предварительно заданного файла
      cat file.txt | sort >file2.txt
        Думаю, вот это

        Массив строк - трудный выбор

        тебе поможет. Рассказано как считать vector <string> из файла, как его сортировать, как обратно в файло засовывать. Так что - дерзай ;)
          Тут уже был подобный вопрос :) Решение было примерно таким:
          ExpandedWrap disabled
            #include <set>
            #include <fstream>
            #include <iostream>
            #include <algorithm>
            #include <string>
            #include <iterator>
             
            int main()
            {
            ifstream file("cities.txt");
            std::set<std::string> m_Cities;
            std::copy(std::istream_iterator<std::string>(file), std::istream_iterator<std::string>(), std::inserter(m_Cities, m_Cities.end());
            std::copy(m_Cities.begin(), m_Cities.end(), std::ostream_iterator(std::cout, "\n"));
            }
            Да, vector используй и все! а потом sort
              Цитата Jenizix @
              Да, vector используй и все! а потом sort

              Зачем, если можно использовать set и без sort?
                Flex Ferrum, твой код можно немного улучшить, используя конструктор, принимающий 2 итератора вместо конструктора по умолчанию. Тогда и один copy не надо использовать.

                Цитата Flex Ferrum @
                #include <iterators>

                только он iterator ;)
                Сообщение отредактировано: byte -
                  Цитата byte @
                  Flex Ferrum, твой код можно немного улучшить, используя конструктор, принимающий 2 итератора вместо конструктора по умолчанию. Тогда и один copy не надо использовать.

                  Точно! :) Про диапазонный конструктор я и забыл... :)
                    Приколисты, блин.
                      Цитата Lucifer @
                      Приколисты, блин.

                      А то!
                        Люди!А без всяких там итераторов никак нельзя? А то я в них не очень. Мне может слова в массив загнать, а потом с ними работать?
                        }
                        ExpandedWrap disabled
                          {
                          char nam[len_File];
                          cout<<" vvedite name file: "<<endl;
                          cin>>nam;
                          ifstream inFile;// входной файловый поток
                          inFile.open(nam);// функция по открытию файла "sourse" и связать его с потоком "InFile"
                          if (!inFile) // проверка правильности введённого файла
                          {cerr<< "Error open File"<<nam;
                          exit(1); // выход
                          }
                          char string[lenString];
                          char next;
                          cout<<"\n text _File:\n\n";
                          cin.get();
                          while(1)
                          {
                          inFile>>string;// ввод слова из файла до пробела
                           
                          next=inFile.peek();// проверка следующего слова
                          if (next==EOF)
                          break;
                          Цитата тигр @
                          А без всяких там итераторов никак нельзя?

                          Можно. А зачем?
                            Блин, ну не разбирался я с ними ещё! Просто мне это защищать надо будет ещё!
                              засунь строки из файла в
                              массив
                              char **;
                              а затем qsort() его.

                              Добавлено
                              PS:могу написать пример если надо.
                              PPS:и если надо пример то какая ОС? и если win32 , то можно использовать WinApi?
                              Сообщение отредактировано: LuckLess -
                                Цитата LuckLess @
                                PS:могу написать пример если надо.

                                Надо
                                  А число городов ограничено???

                                  Добавлено
                                  Вот код, который сортирует слова в строке по алфавиту:
                                  ExpandedWrap disabled
                                    #include<stdlib.h>
                                    #include<string.h>
                                    #include<stdio.h>
                                     
                                    void swap(char* a, char* b) /* ----- меняем местами две строки -----*/
                                    {
                                        int len = (strlen(a)>strlen(b))? strlen(a):strlen(b);// вычисление наиб. длины
                                        char * tmp = new char[len+1]; // хапнем пямяти
                                        strcpy(tmp,a);
                                        strcpy(a,b);
                                        strcpy(b,tmp);
                                        delete tmp;
                                    }
                                     
                                     
                                    void selectSort(char a[][10], long size) /* ----- Сортировка выбором ----- */
                                    {
                                            for(int i = 0; i <= size; i++)
                                                for(int j = 0 ; j < size-i; j++)
                                                    if(strcmp(a[j],a[j+1])>0) // если a[j] > a[j+1] => меняем
                                                        swap(a[j],a[j+1]);
                                    }
                                     
                                    int main( void )
                                    {
                                        char words[30][10]; // тут будут находиться слова ( максимум 30 слов не длиннее 10 символов )
                                        char string[]="mame mama mamy"; // исходная строка...
                                     
                                        /* Просто strtok() изменяет переданную ей строку */
                                        char tmp[300];
                                        strcpy(tmp,string);
                                        /* --------------------------------------------- */
                                        
                                        char word_sort[300]; // тут будет строка со отсортированными по алфавиту словами
                                        char *word = new char[10]; // сюда будет записываться очередное слово
                                        int w = 0; // кол-во слов
                                            
                                        /* ----- Разбиваем строку на слова ------ */
                                        strcpy(words[0],strtok(tmp," "));
                                        while(word = strtok(NULL," "))
                                            strcpy(words[++w],word);
                                        /* -------------------------------------- */
                                        
                                        selectSort(words,w); // сортируем
                                     
                                        word_sort[0]='\0';
                                        
                                        for(int i = 0; i < w+1; i++) // склеиваем слова
                                        {
                                            strcat(word_sort,words[i]);
                                            strcat(word_sort," "); // добавляем пробел между словами
                                        }
                                        word_sort[strlen(word_sort)-1]='\0'; // убираем ненужный последний пробел
                                        
                                          
                                        printf("Ishodnaya stroka: %s\n", string);
                                        printf("Sortirovka : %s\n", word_sort);
                                        
                                       return 0;
                                    }


                                  Переделать думаю сможешь???? ;)
                                  А лучше всетаки STL юзать...
                                  Сообщение отредактировано: Jenizix -
                                    так ....а мне надо в одну строку все слова слить...не напомните...
                                      ExpandedWrap disabled
                                        #include <iostream>
                                        #include <conio.h>
                                        #include <windows.h>
                                        int mystrcmp(const void* ,const void*);
                                        void main(void){
                                            //читаем файл.
                                        HANDLE hFile=CreateFile("1.txt",GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
                                        if (hFile==INVALID_HANDLE_VALUE){
                                            std::cout << "CreateFile() error N" <<GetLastError();
                                            _getch();
                                            return;
                                        }
                                        HANDLE hFileMap = CreateFileMapping(hFile,0,PAGE_READONLY,0,0,0);
                                        if (hFileMap==NULL){
                                            std::cout << "CreateFileMapping() error N" <<GetLastError();
                                            _getch();
                                            CloseHandle(hFile);
                                            return;
                                        }
                                        const char* const rbuff = (char*)MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);
                                        if (rbuff==NULL){
                                            std::cout << "MapViewOfFile() error N" <<GetLastError();
                                            _getch();
                                            CloseHandle(hFile);
                                            CloseHandle(hFileMap);
                                            return;
                                        }
                                        //!читаем файл
                                        //запихиваем строки в char**
                                        const int iFileSize=GetFileSize(hFile,0);
                                         
                                        char** SortMas=NULL;
                                        int SortMasLen=0;
                                        int sm=0;
                                        BOOL NoReadErrors=TRUE;
                                        while(1){
                                            int len;
                                                for (len=0;;len++)  if (rbuff[sm+len]==' ' || sm+len ==iFileSize) break; // Добавь сюда свой символ разделитель.
                                                if (len==0){
                                                    std::cout<<"bad file format";
                                                    NoReadErrors=FALSE;
                                                    break;
                                                }
                                            SortMas=(char**)realloc(SortMas,sizeof(char*)*(++SortMasLen));
                                            SortMas[SortMasLen-1]=(char*)malloc(len);
                                            SortMas[SortMasLen-1][len]='\0';
                                            memcpy(SortMas[SortMasLen-1],rbuff+sm,len);
                                         
                                            if (sm+len==iFileSize) break;
                                            else sm+=len+1;
                                        }
                                        //!запихиваем строки в char**
                                        if (NoReadErrors){
                                            qsort(SortMas,SortMasLen,sizeof(char*),mystrcmp);
                                            for (int i=0;i<SortMasLen;i++){
                                                std::cout << SortMas[i] << "\n";
                                            }
                                            //засовываем все в 1 строку.
                                            char* stroka;
                                            int len=0;
                                         
                                            for (int i=0;i<SortMasLen;i++){
                                                len+=strlen(SortMas[i])+1;
                                            }
                                         
                                            stroka=(char*)malloc(len*sizeof(char));
                                            
                                            int sm=0;
                                            for (int i=0;i<SortMasLen;i++){
                                                int curlen=strlen(SortMas[i]);
                                                strcpy(stroka+sm,SortMas[i]);
                                                stroka[sm+curlen]=' '; //поставь здесь свой символ разделитель.
                                                sm+=curlen+1;
                                            }
                                            stroka[sm-1]='\0';
                                            //!засовываем все в 1 строку.
                                            std::cout << stroka;
                                        }
                                        UnmapViewOfFile(rbuff);
                                        CloseHandle(hFileMap);
                                        CloseHandle(hFile);
                                         
                                         
                                        _getch();
                                        }
                                        int mystrcmp(const void* s11,const void* s22){
                                        const char* s1 = (*(const char**)s11);
                                        const char* s2 = (*(const char**)s22);
                                         
                                        return strcmp(s1,s2);
                                        }


                                      Добавлено
                                      сортирует файл 1.txt , где слова записаны через пробел. Нужно стоб они были записаны через другой символ разделитель --> смотри коментарии к проге.
                                        ничего себе! не многовато ли?

                                        Добавлено
                                        А всё всё понял...спасибо.... :P

                                        Добавлено
                                        A чё он функции qsort не видит?она же стандартная?

                                        ExpandedWrap disabled
                                           qsort(SortMas,SortMasLen,sizeof(char*),mystrcmp);
                                          у меня все видит...
                                          воткни тогда еще
                                          <stdlib.h> and <search.h>
                                            ща... stdlib уже втыкал,...<searchпомогло....
                                            Я в долгу! :no: Спасибо .
                                              Цитата byte @
                                              lex Ferrum, твой код можно немного улучшить, используя конструктор, принимающий 2 итератора вместо конструктора по умолчанию. Тогда и один copy не надо использовать.

                                              Кстати, а как должен выглядить такой код? Если, например, так:
                                              ExpandedWrap disabled
                                                std::set<std::string> m_Cities(std::istream_iterator<std::string>(file), std::istream_iterator<std::string>());

                                              То... тут существует маааааалеьнькая такая проблемка - он не сделает того, что от него ожидает программист. Внимание вопрос - почему :blink: :blink: ? (читавшие последнего Саттера - молчать!!! Дайте людям помучиться :) ).
                                                Цитата Flex Ferrum @
                                                Кстати, а как должен выглядить такой код? Если, например, так:

                                                Ну почему же? Можно примерно так:
                                                ExpandedWrap disabled
                                                  std::set<std::string> m_Cities((std::istream_iterator<std::string>(file)),
                                                  std::istream_iterator<std::string>());

                                                - добавил дополнительные круглые скобки вокруг первого аргумента.
                                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                0 пользователей:


                                                Рейтинг@Mail.ru
                                                [ Script execution time: 0,0542 ]   [ 15 queries used ]   [ Generated: 8.07.25, 10:38 GMT ]