Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 11

Структура "Государство". Структурирование информации

22.11.2016, 20:02. Показов 6628. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Структура "Государство":
- название;
- столица;
- численность населения;
- занимаемая площадь.
Необходимо информацию сохранить в файл. Отсортировать по численности населения и сохранить в новый файл. Программа работает как надо, но необходимо сделать отдельную функцию считывания из файла. Не могу понять как это сделать.
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
#include <iostream>
#include <string>
#include <fstream>
#include <string.h>
 
using namespace std;
 
struct state // структура государство
{
    string name;
    string capital;
    int population;
    int sqare;
};
 
void CreateState(state* Gos, int n) // заполнение массива государств с клавиатуры
{
     for (int i = 0; i < n; i++)
        {
            cout << "Введите название " << i + 1 << " страны: ";
            while (cin.get() != '\n');
            getline(cin, Gos[i].name);
            cout << "Введите столицу страны: ";
            getline(cin, Gos[i].capital);
            cout << "Введите численность населения: ";
            cin >> Gos[i].population;
            cout << "Введите занимаемую площадь: ";
            cin >> Gos[i].sqare;
        }
}
void saveToFile(state *Gos, int n) // сохранение в файл
{
    ofstream fout;
    fout.open("Gos.txt", ios::app); //добавление записи в конец файла
    for (int i = 0; i < n; i++)
    {
        fout << Gos[i].name << " ";
        fout << Gos[i].capital << " ";
        fout << Gos[i].population << " ";
        fout << Gos[i].sqare << endl;
    }
    cout << "Информация была успешно добавлена в файл. " << endl << endl;
    fout.close();
}
 
void strucFile(state *GosFile, int n) // структурирование в файле по возрастанию населения
{
    ifstream fin;
    fin.open("Gos.txt");
    ofstream fout;
    fout.open("Goss.txt");
    for (int i = 0; i < n - 1; i++) // считывание из файла в структуру
    {
        fin >> GosFile[i].name;
        fin >> GosFile[i].capital;
        fin >> GosFile[i].population;
        fin >> GosFile[i].sqare;
        for(int j = i + 1; j < n; j++)
            {
                fin >> GosFile[j].name;
                fin >> GosFile[j].capital;
                fin >> GosFile[j].population;
                fin >> GosFile[j].sqare;
                if (GosFile[i].population > GosFile[j].population)
                {
                    state x;
                    x = GosFile[i];
                    GosFile[i] = GosFile[j];
                    GosFile[j] = x; // swap(GosFile[i], GosFile[j]);
                }
            }
            fout << GosFile[i].name << " ";
            fout << GosFile[i].capital << " ";
            fout << GosFile[i].population << " ";
            fout << GosFile[i].sqare << endl;
    }
    fout.close();
    fin.close();
    cout << "Информация была перезаписана в новый файл! " << endl << endl;
}
 
int countLines() // подсчёт количества строк в файле
{
    int x = 0;
    ifstream fin;
    fin.open("Gos.txt");
    for (int i = 0; !fin.eof(); i++)
    {
        string str;
        getline(fin,str);
        x++;
    }
    return x;
}
 
int main()
{
    setlocale(LC_ALL,"rus");
    while (1)
    {
        cout << "Нажмите 1 для добавления информации. " << endl;
        cout << "Нажмите 2 для записи в новый файл по возрастанию численности населения" << endl;
        cout << "Нажмите 3 для окончания работы с программой. " << endl;
        int flagMenu;
        cin >> flagMenu;
        if (flagMenu == 1)
        {
            cout << "Введите количество государств: ";
            int n;
            cin >> n;
            state* Gos = new state[n];
            CreateState(Gos, n);
            saveToFile(Gos, n);
        }
            int strCount = 0; 
            strCount = countLines(); 
            state* GosFile = new state[strCount]; 
        if (flagMenu == 2)
            strucFile(GosFile, strCount);
        if (flagMenu == 3)
            break;
    }
    return 0;
}
Добавлено через 1 час 45 минут
Никто не подскажет?

Добавлено через 1 час 15 минут
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
state open(int i, int n)
{
    state* user = new state[n];
    ifstream fin;
    fin.open("Gos.txt");
        fin >> user[i].name;
        fin >> user[i].capital;
        fin >> user[i].population;
        fin >> user[i].sqare;
    return user[i];
}
 
void strucFile(state *GosFile, int n) // структурирование в файле по возрастанию населения
{
    ofstream fout;
    fout.open("Goss.txt");
    for (int i = 0; i < n - 1; i++) // считывание из файла в структуру
    {
        GosFile[i] = open(i, n);
        for(int j = i + 1; j < n; j++)
            {
                GosFile[j] = open(j, n);
                if (GosFile[i].population > GosFile[j].population)
                {
                    state x;
                    x = GosFile[i];
                    GosFile[i] = GosFile[j];
                    GosFile[j] = x; // swap(GosFile[i], GosFile[j]);
                }
            }
            fout << GosFile[i].name << " ";
            fout << GosFile[i].capital << " ";
            fout << GosFile[i].population << " ";
            fout << GosFile[i].sqare << endl;
    }
    fout.close();
    cout << "Информация была перезаписана в новый файл! " << endl << endl;
}
Получилось так. Но каждый раз файл открывается заново, как это исправить?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2016, 20:02
Ответы с готовыми решениями:

Структура "Государство". Блочный ввод-вывод
Задание. Сформировать двоичный файл из элементов, заданных в варианте структуры.Напишите программу, которая бы позволяла: - добавлять...

Структура "Государство". Блочный ввод-вывод
Структура &quot;Государство&quot;: - название; - столица; - численность населения; - занимаемая площадь. Удалить все элементы, у которых...

Пользовательские типы данных. Структура "Государство"
Структура «Государство»: название; столица; численность населения; занимаемая площадь. Вычисляемое значение – минимальная занимаемая...

19
Заблокирован
22.11.2016, 20:18
NimBR, а нужно ли исправлять? если программа будет держать файл постоянно открытым то вторая копия программы не сможет внести измения в файл
0
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 11
22.11.2016, 21:01  [ТС]
Не совсем понял. При обращении к state open каждый раз считывается только первая строка.

Добавлено через 31 минуту
Просто по заданию нужно создать именно отдельную функцию считывания из файла.
0
Заблокирован
22.11.2016, 21:31
NimBR, смысл в том что на одном компе могут быть запущены две копии одной программы, и если одна копия будет держать файл открытым то вторая копия выдаст ошибку при попытке сохранить файл.

fin.open("Gos.txt"); те при каждом вызове функции файл открывается вновь и следовательно читается с начала. если файл только один то его можно открыть в начале программы и закрыть в конце программы. но тогда см ошибки сохранения. или же ввести глобальную переменную которая будет блокировать повторное открытие файла
0
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 11
23.11.2016, 15:13  [ТС]
Не совсем так. Есть ещё поиск по стране и городу, где также используется этот файл, т.е. там уже надо будет начинать сначала. Может ещё какие-то варианты есть?

Добавлено через 13 часов 17 минут
Вроде же не сильно сложно... как так, что никто не может подсказать?

Добавлено через 4 часа 16 минут
Ну кто-нибудь может помочь?
0
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 11
25.11.2016, 12:13  [ТС]
Помогите!
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.11.2016, 13:04
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Как вы планируете хранить набор данных, если на момент считывания из файла их количество неизвестно?

Добавлено через 2 минуты
Варианты:
а) использовать std::vector
б) использовать массив с динамическим выделением памяти. Количество элементов будет идти первой строкой в файле.
в) использовать статический массив, при считывании ограничить максимальное количество записей.
г) использовать самописную реализацию динамического списка.

У вас есть подсказки: 50х50, звонок другу, помощь зала
1
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 11
25.11.2016, 14:17  [ТС]
MrGluck, Вы должно быть не до конца поняли суть проблемы, либо я не понял Вас. Есть полностью рабочий код, который в т.ч. прекрасно считывает из файла. Проблема в том, что считывание из файла нужно вынести в отдельную функцию, но, если это сделать, то вызов этой функции из цикла будет каждый раз заново открывать этот файл, считывая только первую строку (см. 2-ой код).
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.11.2016, 14:23
Вы вообще странные вещи в функции open делаете. Создаёте динамический массив, а возвращаете лишь один элемент массива. Тем самым непонятно зачем вообще массив и ещё теряете указатель на динамическую память, что приводит к утечкам.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
state open()
{
    state user;
    ifstream fin("Gos.txt");
    if (fin)
    {
        fin >> user.name;
        fin >> user.capital;
        fin >> user.population;
        fin >> user.sqare;
    }    
    return user;
}
Аналог вашего кода (но без ненужного массива).
Если вы хотите получить набор данных - см мой предыдущий пост.
0
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 11
25.11.2016, 14:31  [ТС]
MrGluck, извините, но ведь тогда при каждом вызове у нас файл будет заново открываться и считывать только первую строку...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (int i = 0; i < n - 1; i++) 
    {
        GosFile[i] = open();
        for(int j = i + 1; j < n; j++)
            {
                GosFile[j] = open();
                if (GosFile[i].population > GosFile[j].population)
                {
                      swap(GosFile[i], GosFile[j]);
                }
            }
            fout << GosFile[i].name << " ";
            fout << GosFile[i].capital << " ";
            fout << GosFile[i].population << " ";
            fout << GosFile[i].sqare << endl;
    }
Два цикла и в каждом из них происходит вызов
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.11.2016, 16:17
Цитата Сообщение от NimBR Посмотреть сообщение
MrGluck, извините, но ведь тогда при каждом вызове у нас файл будет заново открываться и считывать только первую строку...
Так у вас было то же самое.
Если хотите считать все данные, то вам нужно заполнять массив в цикле. Я лишь переписал ваш код с сохранением логики чтобы показать "возможную ошибку".
0
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 11
25.11.2016, 17:45  [ТС]
MrGluck, а как можно заполнить массив в цикле? Не совсем ясна мысль... как сделать что б по порядку считывались строки, а не только первая?

Добавлено через 8 минут
Создавать ещё один цикл в state open() не рационально...
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.11.2016, 17:47
Цитата Сообщение от NimBR Посмотреть сообщение
а как можно заполнить массив в цикле?
Для этого вернемся к вопросу "А как мы узнаем количество элементов, которые нужно считать и куда-то записать?"
0
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 11
25.11.2016, 17:50  [ТС]
Число строк в файле:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int countLines() // подсчёт количества строк в файле
{
    int x = 0;
    ifstream fin;
    fin.open("Gos.txt");
    for (int i = 0; !fin.eof(); i++)
    {
        string str;
        getline(fin,str);
        x++;
    }
    return x;
}
4 элемента в строке...
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.11.2016, 17:56
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
std::istream& operator>>(std::istream &in, state &s)
{
    in >> s.name >> s.capital >> s.population >> s.sqare;
    return in;
}
 
void Load(state *arr, const int size)
{
    ifstream fin("Gos.txt");
    if (!fin)
        return;
    for (int i=0; i < size; i++)
        fin >> arr[i];
    fin.close();
}
 
int main()
{
    const int N = countLines();
    state states[N];
    Load(states, N);
}
1
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 11
25.11.2016, 18:00  [ТС]
MrGluck, спасибо, но такое не проходили, не понятно как работает
C++
1
2
3
4
5
std::istream& operator>>(std::istream &in, state &s)
{
    in >> s.name >> s.capital >> s.population >> s.sqare;
    return in;
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.11.2016, 18:05
Цитата Сообщение от NimBR Посмотреть сообщение
не понятно как работает
Обычная перегрузка оператора считывания с потока. Грубо говоря, "учим" istream/ifstream считывать данные в структуру типа state.

Добавлено через 4 минуты
Можете переписать так:
C++
1
2
3
4
5
6
7
8
9
void Load(state *arr, const int size)
{
    ifstream fin("Gos.txt");
    if (!fin)
        return;
    for (int i=0; i < size; i++)
        fin >> arr[i].name >> arr[i].capital >> arr[i].population >> arr[i].sqare;
    fin.close();
}
1
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 11
25.11.2016, 18:09  [ТС]
MrGluck, Спасибо, всё работает, буду разбираться!

Добавлено через 2 минуты
MrGluck, а, секунду, у меня ведь также с самого начала и было практически.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void strucFile(state *GosFile, int n) // структурирование в файле по возрастанию населения
{
    ifstream fin;
    fin.open("Gos.txt");
    ofstream fout;
    fout.open("Goss.txt");
    for (int i = 0; i < n - 1; i++) // считывание из файла в структуру
    {
        fin >> GosFile[i].name;
        fin >> GosFile[i].capital;
        fin >> GosFile[i].population;
        fin >> GosFile[i].sqare;
...
Получается это никак не упростить?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.11.2016, 18:13
Цитата Сообщение от NimBR Посмотреть сообщение
у меня ведь также с самого начала и было практически.
У вас было принципиально другое:
C++
1
2
3
4
5
6
7
8
9
10
11
state open(int i, int n)
{
    state* user = new state[n];
    ifstream fin;
    fin.open("Gos.txt");
        fin >> user[i].name;
        fin >> user[i].capital;
        fin >> user[i].population;
        fin >> user[i].sqare;
    return user[i];
}
Аналог этого я привёл вам в самом начале. Вы считывали в одну переменную, а не в массив.
Куда упрощать то дальше? Тут просто считывание и цикл.
0
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 11
25.11.2016, 18:16  [ТС]
MrGluck, первое моё сообщение:
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
#include <iostream>
#include <string>
#include <fstream>
#include <string.h>
 
using namespace std;
 
struct state // структура государство
{
    string name;
    string capital;
    int population;
    int sqare;
};
 
void CreateState(state* Gos, int n) // заполнение массива государств с клавиатуры
{
     for (int i = 0; i < n; i++)
        {
            cout << "Введите название " << i + 1 << " страны: ";
            while (cin.get() != '\n');
            getline(cin, Gos[i].name);
            cout << "Введите столицу страны: ";
            getline(cin, Gos[i].capital);
            cout << "Введите численность населения: ";
            cin >> Gos[i].population;
            cout << "Введите занимаемую площадь: ";
            cin >> Gos[i].sqare;
        }
}
void saveToFile(state *Gos, int n) // сохранение в файл
{
    ofstream fout;
    fout.open("Gos.txt", ios::app); //добавление записи в конец файла
    for (int i = 0; i < n; i++)
    {
        fout << Gos[i].name << " ";
        fout << Gos[i].capital << " ";
        fout << Gos[i].population << " ";
        fout << Gos[i].sqare << endl;
    }
    cout << "Информация была успешно добавлена в файл. " << endl << endl;
    fout.close();
}
 
void strucFile(state *GosFile, int n) // структурирование в файле по возрастанию населения
{
    ifstream fin;
    fin.open("Gos.txt");
    ofstream fout;
    fout.open("Goss.txt");
    for (int i = 0; i < n - 1; i++) // считывание из файла в структуру
    {
        fin >> GosFile[i].name;
        fin >> GosFile[i].capital;
        fin >> GosFile[i].population;
        fin >> GosFile[i].sqare;
        for(int j = i + 1; j < n; j++)
            {
                fin >> GosFile[j].name;
                fin >> GosFile[j].capital;
                fin >> GosFile[j].population;
                fin >> GosFile[j].sqare;
                if (GosFile[i].population > GosFile[j].population)
                {
                    state x;
                    x = GosFile[i];
                    GosFile[i] = GosFile[j];
                    GosFile[j] = x; // swap(GosFile[i], GosFile[j]);
                }
            }
            fout << GosFile[i].name << " ";
            fout << GosFile[i].capital << " ";
            fout << GosFile[i].population << " ";
            fout << GosFile[i].sqare << endl;
    }
    fout.close();
    fin.close();
    cout << "Информация была перезаписана в новый файл! " << endl << endl;
}
 
int countLines() // подсчёт количества строк в файле
{
    int x = 0;
    ifstream fin;
    fin.open("Gos.txt");
    for (int i = 0; !fin.eof(); i++)
    {
        string str;
        getline(fin,str);
        x++;
    }
    return x;
}
 
int main()
{
    setlocale(LC_ALL,"rus");
    while (1)
    {
        cout << "Нажмите 1 для добавления информации. " << endl;
        cout << "Нажмите 2 для записи в новый файл по возрастанию численности населения" << endl;
        cout << "Нажмите 3 для окончания работы с программой. " << endl;
        int flagMenu;
        cin >> flagMenu;
        if (flagMenu == 1)
        {
            cout << "Введите количество государств: ";
            int n;
            cin >> n;
            state* Gos = new state[n];
            CreateState(Gos, n);
            saveToFile(Gos, n);
        }
            int strCount = 0; 
            strCount = countLines(); 
            state* GosFile = new state[strCount]; 
        if (flagMenu == 2)
            strucFile(GosFile, strCount);
        if (flagMenu == 3)
            break;
    }
    return 0;
}
Просто преподаватель сказал вынести в отдельную функцию считывание из файла, т.к. используется несколько раз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2016, 18:16
Помогаю со студенческими работами здесь

Структура информации про книгу
Нужно написать программу для ввода информации про книгу ,а именно год издания,автор,название и год выпуска ,через структуры.Так же...

Считывание информации из файла в структура
Имеется 4 файла с данными и 4 структуры. Нужно выгрузить данные в структуры. Программа запускается, но, доходя до строчки считывания...

Структура и обработка информации с файлами
Написать две программы тип файла: последовательный Первая программа для ввода данных и помещение этих данных в файл Данные: Имя,...

Структура Train, вывод информации о поездах
Описать структуру с именем TRAIN, содержащую следующие поля: название пункта назначения; номер поезда; время отправления. Написать...

Структура Student, вывод информации о заданном студенте
1. Описать запись с именем student содержащую следующие поля: 1) Фамилия и имя 2) Предмет 3) Оценка 2. Написать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru