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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
#1

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

30.06.2013, 23:36. Просмотров 1306. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2013, 23:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ansi c, запись и чтение структуры из файла. Накосячил от души (C++):

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

Запись и чтение структуры с файла - C++
Привет всем.Столкнулся с проблема записи структуры в файл и чтения ее из файла.Вот сама структура: struct papa { vector&lt;string&gt; v;...

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

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от Yn94k0 Посмотреть сообщение
Исправил, но теперь он тупо не считывает ничего из файла(
Код покажите, который пробуете.
1
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 01:44  [ТС] #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;
}
Спасибо.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 02:02 #8
C++
1
fwrite (mas, sizeof(struct rent), size, fp);
size - 1 нужно там, где обращение по индексу, здесь, если я правильно понял, весь массив нужно записать (size - размер массива?).

Добавлено через 2 минуты
Покажите как read() вызывается. Откуда видите, что ничего не считывается?
0
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 02:25  [ТС] #9
чёрт, не сплю долго, тупой совсем стал. да, там, вроде, -1 не нужен.
функция вызывается в мэйне
C
1
2
3
                case '\x12':system("cls");
                read(mas,size);
                _getch();break;
там ещё есть ввод через клавиатуру и вывод на экран, удаление и поиск, я просто этот код не привёл.
При считывании из файла массив структур в программу не передаётся вообще ни в каком виде(
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 02:50 #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;
}
0
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 02:54  [ТС] #11
так я как бы добавляю к массиву, что в памяти, массив, что в файле)
Поэтому реаллоцирую память под новый элемент, я же не знаю, сколько элементов записали в файл при предыдущем запуске программы, например.
BTW, всё равно не считывает. Совсем не понимат
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 03:03 #12
Это всё не так делается. Если не знаете сколько структрур в файле, то сначала делается подсчёт, потом выделяется память, потом туда читается.
0
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 03:11  [ТС] #13
хм, а почему? я делаю цикл, в нём выделяю память и сразу же делаю туда запись из файла. В чём разница?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 03:12 #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);
0
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 03:22  [ТС] #15
ноуп, не работает. при дебаге с использованием точек остановки size почему-то равен 5767540, а чтение памяти невозможно у mas. чёрт его знает, буду по-другому реализовывать.
Спасибо, бтв.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2013, 03:22
Привет! Вот еще темы с ответами:

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

Запись структуры и чтение из файла в структуру ( как бы лучше ) - C++
Подкиньте идею как лучше записать структуру в файл и обратно из файла в структуру У меня есть мысль: даны 4 элемента вводим их в...

Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод) - C++
Добрый вечер! Возникла такая проблема, что при добавлении записи, удаляются уже имеющиеся записи в файле. Также не помешала бы помощь в...

Чтение/запись структуры "Клиент" из текстового файла - C++
Здравствуйте. Помогите вывести данные из текстового файла обратно в программу. У меня есть некая структура, и функция которая пишет...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
01.07.2013, 03:22
Ответ Создать тему
Опции темы

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