Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
mortal21
0 / 0 / 0
Регистрация: 11.10.2017
Сообщений: 27
1

Можно ли присвоить одному массиву структур значение другого массива структур и записать его в файл

30.11.2017, 15:18. Просмотров 1245. Ответов 10

Можно ли присвоить одному массиву структур значение другого массива структур и записать его в файл?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2017, 15:18
Ответы с готовыми решениями:

Записать в файл значение элементов массива структур?
Записать в файл значение елементов масива структур и считать их из файла в другой масив.

Заполнить массив структур сканеров и записать его в бинарный файл
Здравствуйте! Новый день - новая проблема. Не могу справиться с заданием семинара, помогите...

не могу присвоить одному массиву значение другого
procedure TForm1.N110Click(Sender: TObject); var i : integer; begin for i:= 1 to 1024 do...

Запись массива структур в бинарный файл и считывание его
Есть такая структура: struct table { public string name; public string...

Ввести из текстового файла данные для массива структур, записать их в типизированный файл
type TStudent=record FIO:string;//Поле Ф.И.О. Ngrup:Integer;//Поле номера группы ...

10
TRam_
зомбяк
1294 / 979 / 285
Регистрация: 14.05.2017
Сообщений: 3,211
30.11.2017, 15:23 2
Присваивать значения можно в цикле по элементам массива.

Добавлено через 1 минуту
Размер массива при этом конечно не изменится.
0
mortal21
0 / 0 / 0
Регистрация: 11.10.2017
Сообщений: 27
30.11.2017, 15:32  [ТС] 3
Окей, а как потом удалить из файла старые элементы массива структуры и записать туда новые элементы массива структуры, ведь при записи в файл придётся заново вводить элементы структуры, если я правильно понял.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
car_owner mas[7]; // отсюда удаляем
    car_owner arr[6]; // сюда записываем
    cout << "Введите номер элемента (1-7), который нужно удалить: ";
    int number;
    int i = 0;
    cin >> number;
    int p = number;
    for (i; i < p; i++)
    {
        arr[i] = mas[i];
    }
    for (p; p < 6; p++)
    {
        arr[p] = mas[p+1];
    }
0
TRam_
зомбяк
1294 / 979 / 285
Регистрация: 14.05.2017
Сообщений: 3,211
30.11.2017, 15:42 4
Считываем файл, закрываем файл, в памяти массив редактируем, открываем файл для записи, записываем всё из памяти.

Либо переименовываем файл, открываем его для чтения, открываем для записи другой, и "читаем из одного - пишем в другой", перед записью или во время неё проводя необходимые манипуляции с данными. Переименованный файл потом удаляем.

Либо комбинируем эти два способа в различных сочетаниях.
0
30.11.2017, 15:42
Herji
296 / 205 / 174
Регистрация: 11.05.2016
Сообщений: 658
Завершенные тесты: 1
30.11.2017, 15:57 5
Цитата Сообщение от mortal21 Посмотреть сообщение
Окей, а как потом удалить из файла старые элементы массива структуры и записать туда новые элементы массива структуры, ведь при записи в файл придётся заново вводить элементы структуры, если я правильно понял.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    car_owner mas[7] = { /*...*/ };
 
    cout << "Введите номер элемента [0-6], который нужно удалить: ";
    int number;
    cin >> number;
    
    fstream file("test.txt", std::ios::out); // открываешь для записи, оно всё само очистит
    if(file.is_open())
    {
        for(int i=0; i<7; i++)
        {
            if(i!=number)
            {
                /* запись элемента */
            }
        }
 
 
        file.close();
    }
0
mortal21
0 / 0 / 0
Регистрация: 11.10.2017
Сообщений: 27
30.11.2017, 19:49  [ТС] 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FILE *f;
    car_owner mas[7] = {};
    cout << "Введите номер элемента [1-7], который нужно удалить: ";
    int number;
    cin >> number;
    fstream file("f.dat", std::ios::out);
    if (f = fopen("f.dat", "wb"))
    {
        for (int i = 0; i < 7; i++)
        {
            if (i != number)
            {
                fwrite(&mas, sizeof(car_owner), 1, f);
            }
        }
        fclose(f);
    }
}
Добавлено через 2 часа 58 минут
Цитата Сообщение от Herji Посмотреть сообщение
car_owner mas[7] = { /*...*/ };
А что нужно добавить в закомментированную часть?
0
shmkv
3308 / 472 / 66
Регистрация: 21.07.2015
Сообщений: 1,232
30.11.2017, 19:55 7
Цитата Сообщение от mortal21 Посмотреть сообщение
Можно ли присвоить одному массиву структур значение другого массива структур и записать его в файл?
Формулировка вопроса некорректна.
0
mortal21
0 / 0 / 0
Регистрация: 11.10.2017
Сообщений: 27
30.11.2017, 19:59  [ТС] 8
Цитата Сообщение от shmkv Посмотреть сообщение
Формулировка вопроса некорректна.
Допустим, есть 6 структур, мы записали их в массив, затем (как-бы удаляя одну выбранную структуру) записываем оставшиеся 5 структур в другой массив, а старый удаляем. Потом нужно очистить файл от "старых" 6 структур и записать туда "новые" 5.
0
shmkv
3308 / 472 / 66
Регистрация: 21.07.2015
Сообщений: 1,232
30.11.2017, 20:03 9
Цитата Сообщение от mortal21 Посмотреть сообщение
Потом нужно очистить файл от "старых" 6 структур и записать туда "новые" 5.
В первой части я не увидел никаких упоминай о записи "старых данных. В целом проблем не вижу никаких: создаешь второй массив и поэлементно копируешь нужные элементы. Для перезаписи файла можно его заново открыть.
А зачем все это нужно? Может проще в структуре отметку сделать, что запись удалена? Это позволит не делать лишних манипуляций с копированием данных.
0
mortal21
0 / 0 / 0
Регистрация: 11.10.2017
Сообщений: 27
30.11.2017, 20:42  [ТС] 10
Цитата Сообщение от shmkv Посмотреть сообщение
Может проще в структуре отметку сделать, что запись удалена?
Нужно именно "удалить" её. Решил использовать вспомогательный файл f1, но всё равно в файл записывается мусор МММММММ...

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
typedef struct
{
    char surname[20];
    char name[20];
    char patronymic[20];
    char car_number[20];
    char phone_number[20];
    char number_of_tech_passport[20];
} car_owner;
 
 
void input()
{
    car_owner s;
    FILE *f;
    int i;
    if ((f = fopen("f.dat", "wb")) == NULL)
    {
        cout << "Невозможно открыть файл!";
        exit(1);
    }
    else
    {
        for (i = 0; i < 7; i++)
        {
            cout << "\nВведите данные: \n";
            cout << "Фамилия: "; gets_s(s.surname, 20);
            cout << "Имя: "; gets_s(s.name, 20);
            cout << "Отчество: "; gets_s(s.patronymic, 20);
            cout << "Номер автомобиля: "; gets_s(s.car_number, 20);
            cout << "Телефон: "; gets_s(s.phone_number, 20);
            cout << "Номер техпаспорта: "; gets_s(s.number_of_tech_passport, 20);
            fwrite(&s, sizeof(car_owner), 1, f);
        }
        fclose(f);
    }
}
 
void output()
{
    FILE *f;
    car_owner mas[7];
    f = fopen("f.dat", "rb");
    if ((f = fopen("f.dat", "rb")) == NULL)
    {
        cout << "Невозможно открыть файл!";
        exit(3);
    }
    else
    {
        int i = 0;
        while (!feof(f) && i < 7)
        {
            fread(&mas[i], sizeof(car_owner), 1, f);
            cout << "\nФамилия, имя, отчество: " << mas[i].surname << " " << mas[i].name << " " << mas[i].patronymic;
            cout << "\nНомер автомобиля: " << mas[i].car_number;
            cout << "\nТелефон: " << mas[i].phone_number;
            cout << "\nНомер техпаспорта: " << mas[i].number_of_tech_passport << endl;
            i++;
        }
        fclose(f);
    }
}
 
void del()
{
    car_owner mas[7];
    FILE *f1;
    cout << "Введите номер элемента [1-7], который нужно удалить: ";
    int number;
    cin >> number;
 
    if (f1 = fopen("f1.dat", "wb"))
    {
        for (int i = 0; i < 7; i++)
        {
            if (i != number)
            {
                fwrite(&mas, sizeof(car_owner), 1, f1);
            }
        }
            fclose(f1);
    }
}
0
Herji
296 / 205 / 174
Регистрация: 11.05.2016
Сообщений: 658
Завершенные тесты: 1
30.11.2017, 21:16 11
Лучший ответ Сообщение было отмечено mortal21 как решение

Решение

Цитата Сообщение от mortal21 Посмотреть сообщение
А что нужно добавить в закомментированную часть?
имелось в виду что массив заполнен

Если вы хотите делать по сишно-бинарному, без проверок принцип примерно такой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int number;
    car_owner mas[3];
 
    FILE *f = fopen("text.txt", "rb"); //открыть для чтения
    for(int i=0; i<3; i++)
        {
            fread(&mas[i], sizeof(car_owner),1,f); //считать 3 структуры из файла в массив
        }
    fclose(f);
 
    std::cin >> number;
 
    f = fopen("text.txt", "wb"); // открыть для записи
    for(int i=0; i<3; i++)
        {
            if(i!=number)
            {
                fwrite(&mas[i], sizeof(car_owner),1,f); //засунуть обратно структуры без индекса number
            }
        }
    fclose(f);
1
30.11.2017, 21:16
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2017, 21:16

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

Сортировка массива структур по одному полю
Приветствую. Задача: отсортировать по возрастанию структуру по одному полю. Вчера поднимал тему:...

Сортировка массива структур по одному из полей
Задание 1.Описать структуру с именем STUDENT, содержащую следующие поля: • NAME – фамилия и...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.