Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
30.06.2013, 23:36     Ansi c, запись и чтение структуры из файла. Накосячил от души #1
Прошу прощения за глупую тему, но я мучаюсь уже долго, сам не могу решить проблему.


структура
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;
}
При записи в файле появляется странно выглядящая запись, в которой из-за знаков типа р*є
р*є
р*є
р*є!
трудно уловить исходный элемент.
При чтении программа вообще крашится.
Помогите, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2013, 23:36     Ansi c, запись и чтение структуры из файла. Накосячил от души
Посмотрите здесь:

Чтение структуры из файла и запись нового C++
Запись\чтение структуры в\из файл(а) C++
C++ Запись/чтение вектора в/из файла.Структуры
C++ Запись и чтение структуры с файла
C++ Запись структуры и её чтение из файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
30.06.2013, 23:48     Ansi c, запись и чтение структуры из файла. Накосячил от души #2
C++
1
2
rent *mas=NULL;
    mas = (rent *)malloc(sizeof(rent));
у вас массив Структур а не одна
C++
1
2
#define  N  // количество 
mas = (rent *)malloc(N * sizeof(rent));
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
30.06.2013, 23:52  [ТС]     Ansi c, запись и чтение структуры из файла. Накосячил от души #3
Ну то есть да, массив структур. Причём массив динамический, в не представленной здесь части есть функция, которая добавляет записи и реаллоцирует память.
Поэтому ту часть исправлять не стоит, не работают именно ф-ии записи и чтения, с остальным всё в порядке(
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.07.2013, 00:09     Ansi c, запись и чтение структуры из файла. Накосячил от души #4
fread(&mas[size], sizeof(struct rent), 1, fp);
size - это размер массива? если да, то mas[size] - это выход за его пределы.
если нет - то выход или не выход зависит от передаваемого значения, которое потом в цикле наращивается.
странные записи в файле могут быть из-за того, что когда в файл сливаются массивы чаров, то сливаются
массивы целиком а не только до нулевого символа. за нулевым символом может быть всякий неинициализированный мусор.
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 00:27  [ТС]     Ansi c, запись и чтение структуры из файла. Накосячил от души #5
Да, с сайзом накосячил, там должно быть mas[size-1]. Исправил, но теперь он тупо не считывает ничего из файла(
А как исправить проблемы с массивами чаров? Я их заполняю gets`ом, нулевой символ должен быть, но fwrite его игнорит, так?
Что же делать?(
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 01:36     Ansi c, запись и чтение структуры из файла. Накосячил от души #6
Цитата Сообщение от Yn94k0 Посмотреть сообщение
Я их заполняю gets`ом, нулевой символ должен быть, но fwrite его игнорит, так?
Это так и должно быть. Бинарный режим так устроен, всё здесь правильно.
Цитата Сообщение от Yn94k0 Посмотреть сообщение
Что же делать?(
Если это по поводу непонятной записи в файле, то ничего не далать. Бинарный режим не предусматривает посмотр содержимого файла в текстовом редакторе. Главное, чтобы информация правильно записывалась в файл, а это определяется при считывании.

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

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;
}
Спасибо.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 02:02     Ansi c, запись и чтение структуры из файла. Накосячил от души #8
C++
1
fwrite (mas, sizeof(struct rent), size, fp);
size - 1 нужно там, где обращение по индексу, здесь, если я правильно понял, весь массив нужно записать (size - размер массива?).

Добавлено через 2 минуты
Покажите как read() вызывается. Откуда видите, что ничего не считывается?
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 02:25  [ТС]     Ansi c, запись и чтение структуры из файла. Накосячил от души #9
чёрт, не сплю долго, тупой совсем стал. да, там, вроде, -1 не нужен.
функция вызывается в мэйне
C
1
2
3
                case '\x12':system("cls");
                read(mas,size);
                _getch();break;
там ещё есть ввод через клавиатуру и вывод на экран, удаление и поиск, я просто этот код не привёл.
При считывании из файла массив структур в программу не передаётся вообще ни в каком виде(
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 02:50     Ansi c, запись и чтение структуры из файла. Накосячил от души #10
Если в файле записано 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;
}
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 02:54  [ТС]     Ansi c, запись и чтение структуры из файла. Накосячил от души #11
так я как бы добавляю к массиву, что в памяти, массив, что в файле)
Поэтому реаллоцирую память под новый элемент, я же не знаю, сколько элементов записали в файл при предыдущем запуске программы, например.
BTW, всё равно не считывает. Совсем не понимат
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 03:03     Ansi c, запись и чтение структуры из файла. Накосячил от души #12
Это всё не так делается. Если не знаете сколько структрур в файле, то сначала делается подсчёт, потом выделяется память, потом туда читается.
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 03:11  [ТС]     Ansi c, запись и чтение структуры из файла. Накосячил от души #13
хм, а почему? я делаю цикл, в нём выделяю память и сразу же делаю туда запись из файла. В чём разница?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 03:12     Ansi c, запись и чтение структуры из файла. Накосячил от души #14
Как-то так:
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);
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 03:22  [ТС]     Ansi c, запись и чтение структуры из файла. Накосячил от души #15
ноуп, не работает. при дебаге с использованием точек остановки size почему-то равен 5767540, а чтение памяти невозможно у mas. чёрт его знает, буду по-другому реализовывать.
Спасибо, бтв.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 03:25     Ansi c, запись и чтение структуры из файла. Накосячил от души #16
По двум функциям сложно судить о логике работы всей программы. Сделать всё можно по-разному. Весь код покажите, тогда что-то смогу сказать.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,915
Записей в блоге: 2
Завершенные тесты: 1
01.07.2013, 03:28     Ansi c, запись и чтение структуры из файла. Накосячил от души #17
А в бинарном режиме файл открыть? Если уж работаете с байтами. Хотя вряд ли поможет, но мешать все в кучу тоже не есть разумно
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 03:32  [ТС]     Ansi c, запись и чтение структуры из файла. Накосячил от души #18
очень странно, сейчас попробовал свой старый вариант (тот, что с циклом и реаллоцированием) замутить, с помощью точек останова выяснил, что он как бы правильные значения из файла считывает, но потом удаляет, когда закончивается выполнение функции "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);//вызов функции вывода 
}
прошу прощение за большое количество кода, едва ли приятно кому-то в нём копаться, посему и не стал скидывать. Я уже из-за спортивного интереса отказываться не хочу от старого варианта.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,915
Записей в блоге: 2
Завершенные тесты: 1
01.07.2013, 03:52     Ansi c, запись и чтение структуры из файла. Накосячил от души #19
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);
}

А так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2013, 04:11     Ansi c, запись и чтение структуры из файла. Накосячил от души
Еще ссылки по теме:

Запись структуры и чтение из файла в структуру ( как бы лучше ) C++
Чтение/запись структуры C++
Запись и чтение структуры в/из файла C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 04:11     Ansi c, запись и чтение структуры из файла. Накосячил от души #20
Я одну ошибку сделал в 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);
Yandex
Объявления
01.07.2013, 04:11     Ansi c, запись и чтение структуры из файла. Накосячил от души
Ответ Создать тему
Опции темы

Текущее время: 16:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru