Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/55: Рейтинг темы: голосов - 55, средняя оценка - 4.84
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283

Сортировка строк файла

11.01.2016, 00:21. Показов 10958. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Пытаюсь написать что-то наподобие БД. Не могу реализовать алгоритм сортировки строк текста файла. Количество строк неизвестно. Известно, что каждая строка состоит из 6 элементов разного типа, разделенных пробелом, но при этом первый элемент - это всегда порядковый номер этой строки. Пример строк:

1 Космос 300 200 100 50
2 Пила 330 200 200 300
3 Вилла 400 100 300 200

Сортировать нужно в порядке увеличения, сравнивая 6-ые элементы каждой строки. Сортированный текст тоже нужно записать в этот же файл. Думал взять два вектора и записывать по строке в них, а потом сравнив элементы их свапнуть при необходимости, но не знаю, как сделать, что бы считывало 1 и 2 строку, а потом 2 и 3 и так далее.

Вот мои наработки кода, сделал только 1 и 2 пункт.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
 
using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::vector;
using std::ifstream;
using std::ofstream;
using std::ios_base;
using std::fstream;
using std::setw;
 
 
struct data
{
    string name;
    int price;
    int time;
    int row;
    int all_place;
} cinema;
 
void header();
void check_file_name(string, ofstream &);
bool check_avial_file(ofstream &);
void print_base_data(string);
void Add_Elem_Data(int);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int k = 1;
    for (;;)
    {
        cout << "  Вид действия:\n";
        cout << "  1 - создание базы данных\n";
        cout << "  2 - добавление новых записей\n";
        cout << "  3 - сортировка по количеству мест\n";
        cout << "  4 - сортировка по цене билета\n";
        cout << "  5 - поиск по наименованию\n";
        cout << "  6 - просмотр базы данных\n";
        cout << "  7 - просмотр базы данных поиска\n";
        cout << "  8 - завершение работы\n";
        cout << "  Выберите операцию -> ";
        int x;
        cin >> x;
 
        string name_file;
 
        switch (x)
        {
        case 1:
            {
                cout << "Введите имя БД: \n";
                cin.get();
                getline(cin, name_file);
                ofstream fout(name_file, ios_base::_Noreplace);
 
                check_file_name(name_file, fout);
                fout.close();
            }
            break;
        case 2:
        {
            Add_Elem_Data(k);
            k++;
            break;
        }
        case 3:
        {
            system("cls");
            cout << "Введите имя БД, которую хотите отсортировать:\n";
            cin.get();
            getline(cin, name_file);
            fstream fiut(name_file, ios_base::in | ios_base::out);
 
            if (!check_avial_file)
            {
                break;
            }
            else
            {
                string temp;
                vector <string> buffer1;
                vector <string> buffer2;
                for (int i = 1; i < k - 1; i++)
                {
                    fiut >> temp;
                    while (temp != "\n")
                    {
                        buffer1.push_back(temp);
                    }
                }
            }
            break;
        }
        case 4:
            header();
            break;
        }
    }
}
// ПРоверка имени на уникальность.
void check_file_name(string name, ofstream  &fout)
{
    while (!fout.is_open())
    {
        cout << "Файл с таким именем уже существует, хотите ввести другое имя? (Y/N) \n";
        string answer;
        cin >> answer;
        if (answer == "Y" || answer == "y")
        {
            cout << "Введите имя БД для записи:\n";
            cin.get();
            getline(cin, name);
            fout.open(name, ios_base::_Noreplace);
        }
        else fout.open(name, ios_base::out);
    }
    system("cls");
    cout << "БД " << name << " создана\n";
}
 
// Проверка наличия файла.
bool check_avial_file(ofstream &fout)
{
    if (!fout.is_open())
    {
        cout << "Файла не существует.\n";
        return false;
    }
    return true;
}
 
// Вывод в консоль 
void print_base_data(string name)
{
    ifstream fin(name);
}
 
//Заголовок для табличного вывода.
void header()
{
    for (int i(0); i < 62; i++) cout << "-";
    cout << endl;
    cout << "| Наименование " << "| Цена билета " << "| Длит-ть сеанса " << "| Рядов " << "| Мест |" << endl;
    for (int i(0); i < 62; i++) cout << "-";
    cout << endl;
}
 
//Добавление элемента в таблицу.
void Add_Elem_Data(int k)
{
    {
        system("cls");
        cout << "Введите имя БД, в которую хотите занести данные:\n";
        string name_file;
        cin.get();
        getline(cin, name_file);
        ofstream fout(name_file, ios_base::_Nocreate & ios_base::app); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
        if (!check_avial_file(fout))
        {
            return;
        }
        else
        {
            cout << "Введите наименование кинотеатра:\n";
            getline(cin, cinema.name);
            cout << "Введите цену билета:\n";
            cin >> cinema.price;
            cout << "Введите время продолжительности сеанса:\n";
            cin >> cinema.time;
            cout << "Введите количество рядов:\n";
            cin >> cinema.row;
            cout << "Введите количество мест всего:\n";
            cin >> cinema.all_place;
 
            fout << k << ' ' << cinema.name << ' ' << cinema.price << ' ' << cinema.time << ' ' << cinema.row << ' ' << cinema.all_place << '\n';
            k++;
            system("cls");
            cout << "Запись добавлена.\n";
            fout.close();
        }
    }
}
Добавлено через 6 минут
И забыл, там есть комментарий такого типа: !!!!!!!!!!!!!!!!. Там у меня почему-то не работает флаг _NoCreate.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.01.2016, 00:21
Ответы с готовыми решениями:

Как создать массив строк, считывая данные из файла (сортировка данных из файла)
Доброго времени суток мне нужно отсортировать по алфавиту слова , которые содержатся в файле #include &lt;iostream&gt; #include ...

Открытие файла. Сортировка строк
В общем имеется файл со списком... Нужно отсортировать в порядке убывания по одному столбцу Popov.A.N. m 3.8 k Litvinov.A.S. m 3.4 i ...

Считывание строк из файла и сортировка , C++
Дело в том , что при считывании из файла последнюю строку считывает 2 раза. Прочитал в интернете мол надо строку очищать чтоб такого не...

14
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
11.01.2016, 00:29
ЗеХель, тебе фактически просто нужно уметь сортировать по любому полю структуры data.
C++
1
2
3
4
vector<data> D; // Вектор с твоим добром, которое нужно сортировать
std::sort(D.begin(), D.end(), 
  [](const data &A, const data &B)->bool{return A.price < B.price;} // Функция сравнения двух элементов по цене
)
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
11.01.2016, 00:35
ЗеХель, pair? строка <-> последний токен, сортировка по второму элементу.
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
11.01.2016, 00:41  [ТС]
nonedark2008, ну сортировать вектора я умею, а вот как занести нужное доброе из файла ( в данном случае элементы строк) я не могу понять.

Добавлено через 1 минуту
cyber-satyr, pair? это метод какой-то? или что это
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
11.01.2016, 00:44
http://www.cplusplus.com/reference/utility/pair/
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
11.01.2016, 00:46  [ТС]
cyber-satyr, а как объединение мне поможет мне вытащить нужную строку в вектор?
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
11.01.2016, 00:47
читаем строку, выделяем последний токен, конвертируем его в int, создаем объект pair<string, int> foo(str, int_num), добавляем его в вектор, сортируем вектор по foo.second.
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
11.01.2016, 00:57  [ТС]
cyber-satyr, мысль понял, но все-таки. Вот я отсортировал вектор и как потом сортировать строки в файле согласно порядку в векторе?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
11.01.2016, 00:58
Лучший ответ Сообщение было отмечено ЗеХель как решение

Решение

Цитата Сообщение от ЗеХель Посмотреть сообщение
как занести нужное доброе из файла ( в данном случае элементы строк) я не могу понять
Для структуры data задай операторы считывания из потока и записи:
C++
1
2
3
ifstream & operator >> (ifstream &in, data &d) {
  in >> d.row >> d.name >> что-то еще;
}
И схожую функцию для ofstream.
Тогда считывание и запись объектов data будет очень простым:
C++
1
2
3
data d;
cin >> d;
cout << d;
1
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
11.01.2016, 01:03
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Иих надо отсортировать в памяти, а потом записать в файл. Если размеры файла это позволяют. Если же нет, придется немного изловчиться.

Добавлено через 4 минуты
ЗеХель, приблизительно так. Тебе осталось только I/O и работа с последним токеном строки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <string>
 
 
int main(int argc, char ** argv)
{
  std::string str[] = {"foo", "bar", "baz"};
  int int_n[] = {10, 5, 20};
  std::vector<std::pair<std::string, int>> vec;
 
  for (int i = 0; i < 3; i++) {
    std::pair<std::string, int> foo(str[i], int_n[i]);
    vec.push_back(foo);
  }
 
  std::sort(vec.begin(), vec.end(), [](const auto &a, const auto &b){
    return a.second < b.second;
  });
 
  for (const auto &i : vec) {
    std::cout << i.first << std::endl;
  }
 
  return 0;
}
Добавлено через 31 секунду
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
bash-4.3~$ g++ --std=c++14 ./sample.cpp
bash-4.3~$ ./a.out 
bar
foo
baz
bash-4.3~$
1
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
11.01.2016, 01:20  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
C++
1
ifstream & operator >> (ifstream &in, data &d) { in >> d.row >> d.name >> что-то еще; }
Это магия, неизвестная для меня, можно посвятить в неё, а то я не понимаю, как реализовать в своем коде это.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
11.01.2016, 01:30
Цитата Сообщение от ЗеХель Посмотреть сообщение
Это магия, неизвестная для меня, можно посвятить в неё, а то я не понимаю, как реализовать в своем коде это.
Пусть у тебя есть стандартный поток ввода cin.
Ты оттуда можешь прочитать, например, одно слово (string), число (int) и т.д.
А теперь ты захотел прочитать переменную типа data:
C++
1
2
3
4
5
6
7
8
struct data
{
    string name;
    int price;
    int time;
    int row;
    int all_place;
};
Что бы что-то считать из cin, ты используешь оператор >>.
Для структуры data нужно только его перегрузить:
C++
1
2
3
4
5
6
7
8
9
10
// Считывание
istream & operator >> (istream &in, data &d) { 
  in >> d.row >> d.name >> Все примитивные поля структуры data;
  return in;
}
// Запись
ostream & operator << (ostream &out, data &d) { 
  out << d.row << d.name << Все примитивные поля структуры data;
  return out;
}
После этого ты можешь читать и записывать объекты data как обычно:
C++
1
2
3
4
5
6
data d;
cout << d;
cin >> d;
fstream f(...);
f << d;
f >> d;
И так для любого потока ввода/вывода
1
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
11.01.2016, 01:31  [ТС]
Цитата Сообщение от ЗеХель Посмотреть сообщение
Это магия, неизвестная для меня, можно посвятить в неё, а то я не понимаю, как реализовать в своем коде это.
Я понял суть работы - мы перегружаем оператор >>, верно? А вот куда нужно вставить данную конструкцию не понятно
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
11.01.2016, 01:35
Цитата Сообщение от ЗеХель Посмотреть сообщение
А вот куда нужно вставить данную конструкцию не понятно
Это просто обычные функции.
Впихни их, например, сразу после задания структуры data.
1
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
11.01.2016, 01:37  [ТС]
nonedark2008, всё, я понял. Ты просто чёртов гений, просто большое спасибо! Нет, даже гигантское!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.01.2016, 01:37
Помогаю со студенческими работами здесь

Сортировка чисел из строк файла
Дан текстовой файл с двумя строками отсортированных чисел, надо отсортировать их вместе и записать в новый текстовый файл. Я только смог...

Сортировка строк и перенос из файла в файл
Всем привет! Задача: на входе файл со строками. Строки из этого файла переносятся в массив типа char, затем этот массив сортируется по...

Сортировка строк файла по убыванию популярности
Доброго времени суток. Дан файл, где в каждой строке пароль и его популярность (пример: 12321 5). Нужно считать файл, отсортировать...

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

Считывание строк из файла в массивы и их сортировка слиянием
Есть файл AB.txt, в котором заданы две отсортированные строки по пять чисел на каждой, считать их в два массива и слить их в один...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru