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

Ansi c, запись и чтение структуры из файла. Накосячил от души

30.06.2013, 23:36. Показов 2966. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу прощения за глупую тему, но я мучаюсь уже долго, сам не могу решить проблему.


структура
C
1
2
3
4
5
6
7
8
9
struct rent
{   
    char name[15];/*<имя клиента*/
    char m_name[20];/*<название арендуемой машины*/
    int rent_per_mounth;/*<рента*/
    int nom;/*<количество месяцев*/
    char number[10];/*<номер машины*/
    int summ;/*<доход компании от клиента*/
};
массив
C
1
2
    rent *mas=NULL;
    mas = (rent *)malloc(sizeof(rent));
запись и чтение
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
#include "type.h"
#include <io.h>
int write(rent *mas,int size)// фукция записи 
{
    FILE *fp = fopen("file.dat","w");//создание файла для записи 
    if(!fp)// проверка на открытие 
        {
            printf("FILE NOT FOUND\n");// ошибка если не открылся 
            return 1;
        }
            fwrite (mas, sizeof(struct rent), 1, fp);
    printf("\t\t\t\tFile was saved\n");//вывод сообщения 
    fclose(fp);// закрытие файла 
    return 0;
}
 
 
 
int read(rent *&mas,int size)//функция чтения 
{
    FILE *fp = fopen("file.dat","r");//открытие файла 
    if(!fp)// проверка открытия 
        {
            printf("FILE NOT FOUND\n");//ошибка 
            return 1;
        }
    while (!feof(fp)) //цикл по чтению
        {
            size++;
            mas = (rent *)realloc(mas, size * sizeof(struct rent));
            fread(&mas[size], sizeof(struct rent), 1, fp);
        }
 
    printf("\t\t\t\tFile was read\n");//вывод сообщения 
    fclose(fp);//закрытие файла 
    return size;
}
При записи в файле появляется странно выглядящая запись, в которой из-за знаков типа р*є
р*є
р*є
р*є!
трудно уловить исходный элемент.
При чтении программа вообще крашится.
Помогите, пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.06.2013, 23:36
Ответы с готовыми решениями:

Запись и чтение структуры с файла
Привет всем.Столкнулся с проблема записи структуры в файл и чтения ее из файла.Вот сама структура: struct papa { ...

Запись структуры и её чтение из файла
пробовал разными способами, ничего не работает, не записывает и не считывает ...

Запись и чтение структуры из файла
Здравствуйте, у меня дано такое задание: Составить программу &quot;Список студентов группы&quot;, в котором указаны - Фамилия,Имя,пол, место...

27
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
30.06.2013, 23:48
C++
1
2
rent *mas=NULL;
    mas = (rent *)malloc(sizeof(rent));
у вас массив Структур а не одна
C++
1
2
#define  N  // количество 
mas = (rent *)malloc(N * sizeof(rent));
0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
30.06.2013, 23:52  [ТС]
Ну то есть да, массив структур. Причём массив динамический, в не представленной здесь части есть функция, которая добавляет записи и реаллоцирует память.
Поэтому ту часть исправлять не стоит, не работают именно ф-ии записи и чтения, с остальным всё в порядке(
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
01.07.2013, 00:09
fread(&mas[size], sizeof(struct rent), 1, fp);
size - это размер массива? если да, то mas[size] - это выход за его пределы.
если нет - то выход или не выход зависит от передаваемого значения, которое потом в цикле наращивается.
странные записи в файле могут быть из-за того, что когда в файл сливаются массивы чаров, то сливаются
массивы целиком а не только до нулевого символа. за нулевым символом может быть всякий неинициализированный мусор.
1
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 00:27  [ТС]
Да, с сайзом накосячил, там должно быть mas[size-1]. Исправил, но теперь он тупо не считывает ничего из файла(
А как исправить проблемы с массивами чаров? Я их заполняю gets`ом, нулевой символ должен быть, но fwrite его игнорит, так?
Что же делать?(
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 01:36
Цитата Сообщение от Yn94k0 Посмотреть сообщение
Я их заполняю gets`ом, нулевой символ должен быть, но fwrite его игнорит, так?
Это так и должно быть. Бинарный режим так устроен, всё здесь правильно.
Цитата Сообщение от Yn94k0 Посмотреть сообщение
Что же делать?(
Если это по поводу непонятной записи в файле, то ничего не далать. Бинарный режим не предусматривает посмотр содержимого файла в текстовом редакторе. Главное, чтобы информация правильно записывалась в файл, а это определяется при считывании.

Добавлено через 1 минуту
Цитата Сообщение от Yn94k0 Посмотреть сообщение
Исправил, но теперь он тупо не считывает ничего из файла(
Код покажите, который пробуете.
1
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 01:44  [ТС]
конечно

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
#include "type.h"
#include <io.h>
int write(rent *mas,int size)// фукция записи 
{
    FILE *fp = fopen("file.dat","w");//создание файла для записи 
    if(!fp)// проверка на открытие 
        {
            printf("FILE NOT FOUND\n");// ошибка если не открылся 
            return 1;
        }
            fwrite (mas, sizeof(struct rent), size-1, fp);
    printf("\t\t\t\tFile was saved\n");//вывод сообщения 
    fclose(fp);// закрытие файла 
    return 0;
}
 
 
 
int read(rent *&mas,int size)//функция чтения 
{
    FILE *fp = fopen("file.dat","r");//открытие файла 
    if(!fp)// проверка открытия 
        {
            printf("FILE NOT FOUND\n");//ошибка 
            return 1;
        }
    while (!feof(fp)) //цикл по чтению
        {
            size++;
            mas = (rent *)realloc(mas, size * sizeof(struct rent));
            fread(&mas[size-1], sizeof(struct rent), 1, fp);
        }
 
    printf("\t\t\t\tFile was read\n");//вывод сообщения 
    fclose(fp);//закрытие файла 
    return size;
}
Спасибо.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 02:02
C++
1
fwrite (mas, sizeof(struct rent), size, fp);
size - 1 нужно там, где обращение по индексу, здесь, если я правильно понял, весь массив нужно записать (size - размер массива?).

Добавлено через 2 минуты
Покажите как read() вызывается. Откуда видите, что ничего не считывается?
0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 02:25  [ТС]
чёрт, не сплю долго, тупой совсем стал. да, там, вроде, -1 не нужен.
функция вызывается в мэйне
C
1
2
3
                case '\x12':system("cls");
                read(mas,size);
                _getch();break;
там ещё есть ввод через клавиатуру и вывод на экран, удаление и поиск, я просто этот код не привёл.
При считывании из файла массив структур в программу не передаётся вообще ни в каком виде(
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 02:50
Если в файле записано size структур, зачем вы realloc делаете? При таком вызове читатать так можно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int read(rent *&mas, int size)//функция чтения 
{
    FILE *fp = fopen("file.dat","r");//открытие файла 
    if(!fp)// проверка открытия 
    {
        printf("FILE NOT FOUND\n");//ошибка 
        return 1;
    }
   
    fread(mas, sizeof(struct rent), size, fp);
    
    printf("\t\t\t\tFile was read\n");//вывод сообщения 
    fclose(fp);//закрытие файла 
    return size;
}
0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 02:54  [ТС]
так я как бы добавляю к массиву, что в памяти, массив, что в файле)
Поэтому реаллоцирую память под новый элемент, я же не знаю, сколько элементов записали в файл при предыдущем запуске программы, например.
BTW, всё равно не считывает. Совсем не понимат
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 03:03
Это всё не так делается. Если не знаете сколько структрур в файле, то сначала делается подсчёт, потом выделяется память, потом туда читается.
0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 03:11  [ТС]
хм, а почему? я делаю цикл, в нём выделяю память и сразу же делаю туда запись из файла. В чём разница?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 03:12
Как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int read(rent *&mas)//функция чтения 
{
    FILE *fp = fopen("file.dat","r");//открытие файла 
    if(!fp)// проверка открытия 
    {
        printf("FILE NOT FOUND\n");//ошибка 
        return 1;
    }
    fseek(fp, 0, SEEK_END);
    int size = ftell(fp);
    fseek (fp, 0, SEEK_SET );
    
    mas = (rent*)realloc(mas, size * sizeof(struct rent));
    
    fread(mas, sizeof(struct rent), size, fp);
    
    printf("\t\t\t\tFile was read\n");//вывод сообщения 
    fclose(fp);//закрытие файла 
    return size;
}
И вызов:
C++
1
size = read(mas);
0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 03:22  [ТС]
ноуп, не работает. при дебаге с использованием точек остановки size почему-то равен 5767540, а чтение памяти невозможно у mas. чёрт его знает, буду по-другому реализовывать.
Спасибо, бтв.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 03:25
По двум функциям сложно судить о логике работы всей программы. Сделать всё можно по-разному. Весь код покажите, тогда что-то смогу сказать.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
01.07.2013, 03:28
А в бинарном режиме файл открыть? Если уж работаете с байтами. Хотя вряд ли поможет, но мешать все в кучу тоже не есть разумно
0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 03:32  [ТС]
очень странно, сейчас попробовал свой старый вариант (тот, что с циклом и реаллоцированием) замутить, с помощью точек останова выяснил, что он как бы правильные значения из файла считывает, но потом удаляет, когда закончивается выполнение функции "read". Удивительно. И size принимает какие-то уж совсем странные значения.

Код:
data.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>// ПОдключение библиотек
#include <stdlib.h>
#include <locale.h>
#include <limits.h>
#include <conio.h>
/**@file data.h*/
/*Структура данных "Прокат"*/
#ifndef DATA_H
#define DATA_H
struct rent
{   
    char name[15];/*<имя клиента*/
    char m_name[15];/*<название арендуемой машины*/
    int rent_per_mounth;/*<рента*/
    int nom;/*<количество месяцев*/
    char number[10];/*<номер машины*/
    int summ;/*<доход компании от клиента*/
};
#endif DATA_H
type.h
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
/**@file type.h*/
#include "data.h"
#ifndef TYPE_H//условная компиляций 
#define TYPE_H
//Ввод данных
int enter(rent *&mas, int size);
/**ref Enter_show.cpp*/
//Вывод данных
int show(rent *&mas,int size);
/**ref Enter_show.cpp*/
//Чтение из файла 
int read(rent *&mas,int size);
/**ref read_write.cpp*/
//Запись в файл
int write(rent *mas,int size);
/**ref read_write.cpp*/
//Удаление данных
int delet(rent *&mas,int size);
/**ref delet_proc.cpp*/
//Комплект меню
int menu1();
/**ref menu.cpp*/
//Меню выбора сортировок
int menu_sort(rent *&mas,int size);
/**ref menu.cpp*/
//Функция поиска даных
int find(rent *mas,int size);
/**ref delet_proc.cpp*/
//Сортировка пузырька
void sort_puz(rent *&mas,int size);
/**ref sort.cpp*/
//Сортировка шелла
void sort_shell(rent *&mas,int size);
/**ref sort.cpp*/
// Быстрая Сортировка
void quick_sort(rent *&mas,int first, int end);
/**ref sort.cpp*/
//Основная программа 
void programm();
/**ref display.cpp*/
#endif TYPE_H
файл исходного кода main.cpp
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
#include "type.h"
void main()
{
    int size=0;
    bool key = false;
    rent *mas=NULL;
    mas = (rent *)malloc(sizeof(rent));
    do
    {
        system("cls");//очистака экрана
        menu1();//вывод меню
        switch(_getch())
            {
                case '\x5':system("cls");
                size = enter(mas, size);
                break;//выбор Пункта меню 
                
                case '\x16':system("cls");
                show(mas,size);
                _getch();break;
 
                case '\x13':system("cls");
                write(mas,size);
                _getch();break;
 
                case '\x12':system("cls");
                read(mas,size);
                _getch();break;
 
                case '\x4':system("cls");
                size = delet(mas,size);
                _getch();break;
 
                case '\x6':system("cls");
                find(mas,size);
                _getch();break;
 
                case '\f':system("cls");
                menu_sort(mas,size);
                _getch();break;
 
                case '\x11':system("cls");key = true ;break;
            }
    }while(key!= true);
}
ресурсы:
search_del
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
#include "type.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
int delet(rent *&mas,int size)//функция удаления 
{
    int number;
    printf("Enter number of record\n");
    scanf("%d", &number);
    for (int i = number; i < size; i++)
    {
            mas[i-1]=mas[i];//удаление 
            strcpy(mas[i].name, " ");
            strcpy(mas[i].m_name, " ");
            strcpy(mas[i].number, " ");
            mas[i].rent_per_mounth=0;
            mas[i].nom=0;
            mas[i].summ=0;
        }
    size--;//уменьшение размерности
    return size;//возврат значения 
}
int find(rent *mas,int size)//функция поиска 
{
    char S[60]; 
    printf("Enter client`s name for search : ");
    gets(S);
    for(int i=0;i<size;i++)//цикл поиска
        {
            if(strcmp(S, mas[i].name)==0)//условие поиска 
                {
                    printf("\tName\t\tMachine`s name  Per mouth  Duration\tNumber  Summ\n\n");//шапка таблицы 
                    printf("%16s",mas[i].name);
                    printf("%16s\t  ",mas[i].m_name);
                    printf("%d\t",mas[i].rent_per_mounth);
                    printf("%d\t",mas[i].nom);
                    printf("%7s  ",mas[i].number);
                    printf("%d\n",mas[i].summ);
                    return 0;//удачное завершение 
                }
    else
    {
    printf("\t\t\t\tThere`s no enties\n");//вывод сообщение 
    return 1;//ошибочное завршение 
    }
        }
}
enter_show
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
#include "type.h"
 
int enter(rent *&mas, int size)//функция ввода 
{
    int hm=0;
    printf("Enter number of client : ");
    scanf("%d",&hm);//ввод кол - во записей
    _flushall();//очистка буфера ввода
 
    size=size+hm;
    mas = (rent *)realloc(mas, size * sizeof(struct rent));
 
    for(int i=(size-hm);i<(size);i++)//цикл по вводу 
        {
            system("cls");
            printf("Enter name of client:");
            gets(mas[i].name);
            _flushall();
            printf("Enter name of machine:");
            gets(mas[i].m_name);
            _flushall();
            printf("Enter rent per mounth:");
            scanf("%d",&mas[i].rent_per_mounth);
            _flushall();
            printf("Enter number of mounth:");
            scanf("%d",&mas[i].nom);
            _flushall();
            printf("Enter number of machine:");
            gets(mas[i].number);
            mas[i].summ = mas[i].nom  * mas[i].rent_per_mounth;
        }
    return size;//возврат значения 
}
int show(rent*&mas,int size)//функция вывода 
{
    printf("\tName\t\tMachine`s name  Per mouth  Duration\tNumber  Summ\n\n");//шапка таблицы 
    for (int i=0;i<size;i++)
        {   
            printf("%16s",mas[i].name);
            printf("%16s\t  ",mas[i].m_name);
            printf("%d\t",mas[i].rent_per_mounth);
            printf("%d\t",mas[i].nom);
            printf("%7s  ",mas[i].number);
            printf("%d\n",mas[i].summ);
        }
    printf("\n\n");
    return 0;
}
menu
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
#include "type.h"
//Реализация функций отображение на экране
int menu1()
{
    printf("\t\t\t\tRent\n\t\t\t\tPress\n\n\n");
    printf("Ctr+e enter ");
    printf("Ctr+v view ");
    printf("Ctr+s.save ");
    printf("Ctr+r read ");
    printf("Ctr+d.del ");
    printf("Ctr+f search ");
    printf("Ctr+l sort ");
    printf("Ctr+q esc");
    return 0;
}
int menu_sort(rent *&mas,int size)
{
    printf("1.Bubble sort | 2.Shell`s sort | 3.Fast sort\n\n");
    switch(_getch())
        {
            case 49:system("cls");sort_puz(mas,size);_getch();break;
            case 50:system("cls");sort_shell(mas,size);_getch();break;
            case 51:system("cls");quick_sort(mas,0,size-1);_getch();break;
        }
    return 0;
}
read_write
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
#include "type.h"
#include <io.h>
int write(rent *mas,int size)// фукция записи 
{
    FILE *fp = fopen("file.dat","w");//создание файла для записи 
    if(!fp)// проверка на открытие 
        {
            printf("FILE NOT FOUND\n");// ошибка если не открылся 
            return 1;
        }
            fwrite (mas, sizeof(struct rent), size, fp);
    printf("\t\t\t\tFile was saved\n");//вывод сообщения 
    fclose(fp);// закрытие файла 
    return 0;
}
 
 
 
int read(rent *&mas,int size)//функция чтения 
{
    FILE *fp = fopen("file.dat","r");//открытие файла 
    if(!fp)// проверка открытия 
        {
            printf("FILE NOT FOUND\n");//ошибка 
            return 1;
        }
    while (!feof(fp)) //цикл по чтению
        {
            size++;
            mas = (rent *)realloc(mas, size * sizeof(struct rent));
            fread(mas, sizeof(struct rent), 1, fp);
        }
 
    printf("\t\t\t\tFile was read\n");//вывод сообщения 
    fclose(fp);//закрытие файла 
    return size;
}
sort

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
#include "type.h"
void sort_puz(rent *&mas,int size)//функция сортировки 
{
    rent key;
    for(int i=0;i<size;i++)//циклы по перебору 
        for(int j=0;j<size-1;j++)
            {
                if(mas[i].summ>mas[j].summ)//условие сравнения 
                    {
                        key=mas[i];//объмен элементами 
                        mas[i]=mas[j];
                        mas[j]=key;
                    }
            }
    show(mas,size);//вызов функции вывода 
}
void sort_shell(rent *&mas,int size)
{
    int d,i,j;
    rent key;
    d=size;//шаг сортировки 
    while (d>1)
    {
        i=0;
        d=d/2;
        while ((j=i+d)<size)//проверка разделенных массивов
            {
                if (mas[j].summ>mas[i].summ)//сравнение и обмен
                 {
                     key=mas[i];
                     mas[i]=mas[j];
                     mas[j]=key;
                 }
             i++;
            }
    }
    show(mas,size);//вызов функции вывода 
}
void quick_sort(rent *&mas,int first,int end)
{
    rent key,k;
    int i=first,j=end;
    k.summ = mas[(first+end)/2].summ;//нахождение центрального элемента
    do  {
        while (mas[i].summ<k.summ)i++;//проход по элементам 
        while (mas[j].summ>k.summ)j--;          
                if (i<=j)
                    { 
                        if (i<j)
                        {
                            key=mas[j];//обмен 
                            mas[j]=mas[i];
                            mas[i]=key; 
                        }
                    i++;
                    j--;
                    }
             
      }while (i<=j);//условие завершения цикла 
    if (i<end) //вызов рекурсии
        {
            quick_sort(mas,i,end);//рекурсия 
        }
    if (first<j)  
        {
            quick_sort(mas,first,j);
        }
    show(mas,end+1);//вызов функции вывода 
}
прошу прощение за большое количество кода, едва ли приятно кому-то в нём копаться, посему и не стал скидывать. Я уже из-за спортивного интереса отказываться не хочу от старого варианта.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
01.07.2013, 03:52
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int read(rent *&mas,int size)//функция чтения 
{
    FILE *fp = fopen("file.dat","r");//открытие файла 
    if(!fp)// проверка открытия 
        {
            printf("FILE NOT FOUND\n");//ошибка 
            return 1;
        }
    while (!feof(fp)) //цикл по чтению
        {
            size++;
            mas = (rent *)realloc(mas, size * sizeof(struct rent));
            fread(mas+size-1, sizeof(struct rent), 1, fp);
        }
 
    printf("\t\t\t\tFile was read\n");//вывод сообщения 
    fclose(fp);//закрытие файла 
    return size;
}
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
int main()
{
    int size=0;
    bool key = false;
    rent *mas=NULL;
    mas = (rent *)malloc(sizeof(rent));
    do
    {
        system("cls");//очистака экрана
        menu1();//вывод меню
        switch(_getch())
            {
                case '\x5':system("cls");
                size = enter(mas, size);
                break;//выбор Пункта меню 
                
                case '\x16':system("cls");
                show(mas,size);
                _getch();break;
 
                case '\x13':system("cls");
                write(mas,size);
                _getch();break;
 
                case '\x12':system("cls");
                size=read(mas,size);
                _getch();break;
 
                case '\x4':system("cls");
                size = delet(mas,size);
                _getch();break;
 
                case '\x6':system("cls");
                find(mas,size);
                _getch();break;
 
                case '\f':system("cls");
                menu_sort(mas,size);
                _getch();break;
 
                case '\x11':system("cls");key = true ;break;
            }
    }while(key!= true);
}

А так?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 04:11
Я одну ошибку сделал в read(). Вот так всё работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int read(rent *&mas)//функция чтения 
{
    
    FILE *fp = fopen("file.dat","rb");//открытие файла 
    if(!fp)// проверка открытия 
    {
        printf("FILE NOT FOUND\n");//ошибка 
        return 1;
    }
    fseek(fp, 0, SEEK_END);
    int size = ftell(fp) / sizeof(struct rent);
    fseek (fp, 0, SEEK_SET );
    
    mas = (rent*)realloc(mas, size  * sizeof(struct rent));
    
    fread(mas, sizeof(struct rent), size, fp);
    
    printf("\t\t\t\tFile was read\n");//вывод сообщения 
    fclose(fp);//закрытие файла 
    return size;
}
Вызов:
C++
1
size = read(mas);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.07.2013, 04:11
Помогаю со студенческими работами здесь

Запись и чтение структуры в/из файла
Столкнулся с очередной проблемой. Есть несколько участков кода: Структура &quot;Абонент&quot;: struct Subscriber { char...

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

Запись/чтение вектора в/из файла.Структуры
Доброе время суток.Проблема заключается в следующем: в файл идет запись вектора (запись вроде-бы успешна,насколько я могу судить).После...

Чтение структуры из файла и запись нового
Из файла вводятся записи структурой имя - стринг, ТК - место работы тоже структура из AS - место (стринг), Tel - телефон с клавиатуры...

Чтение структуры из файла и запись нового - C++
Помогите написать данную программу. На магнитном диске подготовлен файл данных такой структуры: фамилия и инициалы автора - 20 знаков;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru