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

Чтение строк массива структур из файла

11.02.2022, 17:29. Показов 1000. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

У меня возникла такая проблема, записываю в файл строку с 2 словами, когда считываю и вывожу на экран, выводится строка только с одним словом.

При использовании fgets, появляется в строке 133 (если её включить, а 132 закомментировать) такая ошибка: cannot convert 'char (*)[255]' to 'char*'

Подскажите пожалуйста, в чём может быть проблема и как её можно решить. Буду очень Вам благодарен

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
#include <stdio.h>
#include <cstdio>
#include <iostream>
#include <limits>
#include <string.h>
#include <conio.h>
#include <time.h>
#include <locale.h>
 
struct cafe
{
    char name[255];
    char address[255];
    char phone [30];
    char places [30];
    char specialization [255];
};
 
void MemoryAllocation(struct cafe *&b,  int &R);
int EnterElements(struct cafe *b,  int R);
int PrintScreenElements(struct cafe *b,  int R);
int WriteFileElements(struct cafe* b,  int R);
int ReadFileElements(struct cafe* b,  int R);
 
int main()
{
    setlocale(LC_ALL,".1251");
    int N, ch;
    struct cafe *b = NULL;
 
    printf (" 1. Выделение памяти для массива.\n");
    printf (" 2. Ввод с клавиатуры.\n");
    printf (" 3. Запись в файл.\n");
    printf (" 4. Чтение из файла.\n");
    printf (" 5. Вывести на экран.\n");
 
    do
    {
        printf ("\n\n Выберите номер из меню: ");
        scanf ("%d", &ch);
        switch(ch)
        {
        case 1:
            MemoryAllocation( b, N);
            printf ("\n адрес b = %x, значение b = %p", &b, b);
            break;
 
        case 2:
            EnterElements(b, N);
            break;
 
        case 3:
            WriteFileElements(b, N);
            break;
 
        case 4:
            ReadFileElements(b, N);
            break;
 
        case 5:
            PrintScreenElements(b, N);
            break;
        }
    }
    while (ch <= 5);
    getch();
    return 0;
}
//1 Динамическое выделение памяти для массива структур;
void MemoryAllocation(struct cafe *&b, int &R)
{
    printf("\n Размер массива: ");
    scanf("%d", &R);
    b = new cafe[R];
    if ( b == NULL){
        printf("\n Динамическая память не выделяется ");
        exit(1);
    }
    else{
        printf("\n Выделенная память для записей: %d bytes", R*sizeof(cafe));
    }
 
}
//2 Ввод элементов массива с клавиатуры;
int EnterElements(struct cafe* b,  int R )
{
    int i;
    for ( i = 0; i < R; i++){
        fflush(stdin);
        printf("\n Введите необходимые данные о кафе\n\n");
        printf(" Название: ");
        gets(b[i].name);
 
        printf(" Адрес: ");
        gets(b[i].address);
 
        printf(" Номер телефона: ");
        gets(b[i].phone);
 
        printf(" Количество мест в зале: ");
        gets(b[i].places);
 
        printf(" Специализация кафе: ");
        gets(b[i].specialization);
    }
    return 0;
}
//3 Запись массива структур в файл  .txt;
int WriteFileElements(struct cafe* b,  int R){
    int i;
    FILE *fp;
 
    fp = fopen("cafe.txt", "w");
 
    for ( i = 0; i < R; i++){
        fprintf(fp, "%s %s %s %s %s\n", b[i].name, b[i].address, b[i].phone, b[i].places, b[i].specialization);
    }
    fclose ( fp );
 
    return 0;
}
//4 Чтение массива структур из файла  .txt
int ReadFileElements(struct cafe* b, int R){
    int i;
    FILE *fp;
    fp = fopen("cafe.txt", "r");
    if (fp == NULL){
        printf (" Нет файла с данными");
        return 1;
    }
    for ( i = 0; i < R; i++ ){
        fscanf(fp, "%s %s %s %s %s\n", &b[i].name, &b[i].address, &b[i].phone, &b[i].places, &b[i].specialization);
        //fgets (&b[i].name, &b[i].address, &b[i].phone, &b[i].places, &b[i].specialization, 256, fp );
    }
    fclose ( fp );
    return 0;
}
//5 Отображение элементов массива на экране
int PrintScreenElements(struct cafe* b, int R){
    int i;
 
    printf("\n");
    for ( i = 0; i < R; i++){
        printf("|%4d | %-16s | %-13s | %11s | %17s | %-19s |\n", i+1, b[i].name, b[i].address, b[i].phone, b[i].places, b[i].specialization);
    }
    return 0;
}
Миниатюры
Чтение строк массива структур из файла   Чтение строк массива структур из файла   Чтение строк массива структур из файла  

0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.02.2022, 17:29
Ответы с готовыми решениями:

Чтение из файла массива структур
/* 4. Дана информация о семи студентах. Структура имеет вид: фамилия, имя, отчество и 4 оценки за экзамены. Вывести данные о...

Чтение массива структур из файла
есть структура typedef struct { unsigned short codeContribution; unsigned short contributorCode; float amountContribution;...

Чтение массива структур из файла
Я пишу программу которая будет сохранять введённые данные в файл, а затем выводить на экран. Нужно прочитать первые 2 строки и записать их...

6
Заблокирован
11.02.2022, 18:33
%s считывает до пробельного символа (isspace)
Используйте %Nс , где N нужное количество символов.
1
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 90
11.02.2022, 21:28  [ТС]
Когда ввожу данные с клавиатуры, записываю в файл, потом считываю и вывожу на экран, всё работает, как надо, а вот когда захожу в программу, считываю и вывожу на экран, выдаёт пустые клетки.
Миниатюры
Чтение строк массива структур из файла  
0
Заблокирован
11.02.2022, 23:36
Лучший ответ Сообщение было отмечено ABBAjur как решение

Решение

ABBAjur, кто вас учил в файлы так писать ?
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
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
using namespace std;
struct Cafe
{
    string name;
    string address;
    string phone;
    string places;
    string specialization;
};
 
ostream& write(ostream& out, const Cafe& c){
   return out << c.name << endl <<  c.address << endl << c.phone << endl << c.places << endl << c.specialization;
}
istream& read(istream& in, Cafe& c){
   return getline(in, c.name) , getline(in, c.address) , getline(in, c.phone) , getline(in, c.places) , getline(in, c.specialization);
}
 
int main()
{
    // запись в файл
    vector<Cafe> cafe_list {
        {"Sun rise", "Viven st.", "+399-0555-366-66", "Penthouse Ford", "Icecream" },
        {"Sun rise", "Viven st.", "+399-0555-366-66", "Panthouse Ford", "Icecream" },
        {"Sun rise", "Viven st.", "+399-0555-366-66", "Panthouse Ford", "Icecream" }
    };
    ofstream fw("cafe_list.txt");
    if (fw.is_open()){
        for (const auto& cafe : cafe_list){
            write(fw, cafe);
            fw << endl;
        }
        fw.close();
    }else
        cout << "Can not open file to write.";
 
    // чтение данных
    cafe_list.clear();
    ifstream fr("cafe_list.txt");
    if (fr.is_open()){
        Cafe tmp{};
        while(read(fr, tmp))
            cafe_list.push_back(tmp);
        fr.close();
    }else
        cout << "Can not open file to read.";
 
    for (const auto & cafe : cafe_list)
        write(cout, cafe) << endl << endl;
 
}
1
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 90
12.02.2022, 12:07  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
кто вас учил в файлы так писать
Я понимаю, что это выглядит не очень, но такое дали задание, что нужно работать именно с массивами структур.

Цитата Сообщение от ABBAjur Посмотреть сообщение
Когда ввожу данные с клавиатуры, записываю в файл, потом считываю и вывожу на экран, всё работает, как надо, а вот когда захожу в программу, считываю и вывожу на экран, выдаёт пустые клетки.
А по этой проблеме, будут какие-нибудь идеи?
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
12.02.2022, 12:37
А по этой проблеме, будут какие-нибудь идеи?
Мне кажется тут проблема в переменной N
Ей задается значение только при создании массива. Соответственно если его не создавать, а сразу читать из файла, то ничего не читается.

Добавлено через 1 минуту
C++
1
i < R
0
Заблокирован
12.02.2022, 17:27
Цитата Сообщение от ABBAjur Посмотреть сообщение
Я понимаю, что это выглядит не очень, но такое дали задание, что нужно работать именно с массивами структур.
А я с чем работаю ???
Если имеете ввиду char вместо string, то все равно принципиально ничего не меняется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.02.2022, 17:27
Помогаю со студенческими работами здесь

Чтение массива структур из файла
Здравствуйте! Для данной программы, нужно реализовать чтение массива структур из файла. При автозаполнении все работает правильно, но с...

Запись и чтение массива структур с файла
Есть массив структур struct X { char BB; int AA; }; Как записать этот массив в фаил и потом его считать при необходимости. ...

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

Чтение из двоичного файла в массива структур
У меня есть класса user со структурой info class user { public: struct info { std::string login; std::string...

Чтение массива структур из текстового файла
Привет! Есть такая структура: struct Countries::Country { char name; int brand; }; и файл вида: russia 45 78 19 24 ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru