Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
1

Сохранение структуры в бинарно-открытый файл. Кто подскажет?

26.02.2012, 17:50. Просмотров 2006. Ответов 39
Метки нет (Все метки)

Всем привет!)

собственно проблема:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FILE *fin=fopen(def,"a+b");
            
                puts("\nEnter name:\n");                
                cin>> group->name;
                
                puts("\nEnter addres:\n");
                cin>>group->addr;
                
                puts("\nEnter date of birth:\n");
                cin>>group->dateofb;
                
                puts("\nEnter <score>:\n");
                cin >> group->score;
 
                // fwrite(?,?,?,fin);
                fclose(fin);
Друзья. Структура st , создал в мэйне переменную:

st group

вот заполняю поля и хочу сохранить в файл.. но никак не могу разобраться чтоб целую структуру сохранило, вообще - возможно ли это сделать или нужно сохранение поочередно, по-полю? подскажите.. или скажите что можно почитать об этом.. может что-то упустил.. структура вроде заполняется нормально.. но вот сохранить в файл - не хочет( fwrite оставил пустым вкоде.. скажите что вставить.. буду дико благодарен!

Добавлено через 4 минуты
там где def , в открытии файла: D:\\base.txt
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2012, 17:50
Ответы с готовыми решениями:

Замена структуры в бинарно-открытом файле
Собственно, уже на форуме помогали с одной темкой... Суть такова: Работаю с...

Сохранение структуры. Можно ли структуру записать целиком в файл?
давно интересует такой вопрос: можно ли сразу записать структуру целиком в...

Поиск в бинарно-открытом файле
Друзья! очень нужна помощь! FILE *fin=fopen(def,&quot;ab+&quot;); Открываю файл, в...

Сохранение структуры в файл
Есть структура struct Table { int Number; ...

Сохранение структуры в файл
Дана структура: public struct Uchastnik { public...

39
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 19:39 21
хм.. да...
я fread перепутал с read в плане возвращаемого значения)
0
DU
1489 / 1135 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2012, 19:42 22
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                        for(k=0;k<i;k++)
                        {       
                                FILE *fin=fopen(def,"a+b");
                        
                                puts("\nEnter name:\n");                                
                                cin>> group->name;
                                
                                puts("\nEnter addres:\n");
                                cin>>group->addr;
                                
                                puts("\nEnter date of birth:\n");
                                cin>>group->dateofb;
                                
                                puts("\nEnter <score>:\n");
                                cin >> group->score;
 
                                fwrite(&group,sizeof(group),1,fin);
                                fclose(fin);
                        }
вот тут файл на каждой итерации открывается и закрывается. на каждой итерации предыдущая инфа будет перезатираться новой. поэтому открытие и закрытие нужно вынести за пределы тела цикла.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 19:43 23
твои ф-ии
add и print
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
void add()
{
    int i,k;
    st group;
 
    puts("Now you can add some students to the base");
    puts("\n Please, type, how many students you wish to add?\n");
    scanf("%d",&i);
    puts("\n");
 
    for(k=0;k<i;k++)
    {       
        FILE *fin=fopen(def,"a+b");
 
        puts("\nEnter name:\n");                                
        scanf("%39s", group.name);
 
        puts("\nEnter addres:\n");                      
        scanf("%49s", group.addr);
 
        puts("\nEnter date of birth:\n");                            
        scanf("%19s", group.dateofb);
 
        puts("\nEnter <score>:\n");                             
        scanf("%d", &group.score);
 
        fwrite(&group,sizeof(group),1,fin);
        fclose(fin);
    }
 
    system("cls");
    puts("Done...");
}
 
void print()
{       
    st group;
    FILE *fin=fopen(def,"rb");
    while(!feof(fin))
    {
        if(!fread(&group, sizeof group, 1, fin))
            break;
        printf("%s %s %s %d\n", group.name, group.addr
            , group.dateofb, group.score);
    }
    puts("\n\n");
    fclose(fin);
}
проверил работают
1
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 19:43  [ТС] 24
но я же сделал открытие с "а" , это как дозапись.. по идее не должно. но сейчас переделаю...
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 19:44 25
Цитата Сообщение от DU Посмотреть сообщение
инфа будет перезатираться новой
это врядли. режим "a+b"
0
DU
1489 / 1135 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2012, 19:44 26
ну может и так. я режимы открытия не смотрел. но все равно это криво. зачем делать одно и то же на каждой итерации, когда это можно сделать один раз перед и после цикла.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 19:46 27
вот с этим не поспоришь)
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 19:51  [ТС] 28
как бы по-задумке, что если вдруг код слетит, то данные введенные сохранятся.. допустим ввожу 100 студентов, на 90м слетает .. комп перегружается - то инфа же не сохранится.. по идее так) ну это ладно..

чет.. вобщем, вот что сделал:
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
void print(st *group)
        {   
            int i=0;
            FILE *fin=fopen(def,"rb");
 
            while(!feof(fin))
            {   
                fread(group,sizeof(group),1,fin);
                printf("%s %s %s %d\n",group->name,group->addr,group->dateofb,group->score);
            }
 
            puts("\n\n");
            fclose(fin);
        }
 
void add(st *group)
        {
            int i,k;
            
            puts("Now you can add some students to the base");
            puts("\n Please, type, how many students you wish to add?\n");
            scanf("%d",&i);
            puts("\n");
            FILE *fin=fopen(def,"a+b");
            for(k=0;k<i;k++)
            {   
                
            
                puts("\nEnter name:\n");                
                cin>> group->name;
                
                puts("\nEnter addres:\n");
                cin>>group->addr;
                
                puts("\nEnter date of birth:\n");
                cin>>group->dateofb;
                
                puts("\nEnter <score>:\n");
                cin >> group->score;
 
                fwrite(&group,sizeof(*group),1,fin);
                
            }
            fclose(fin);
            system("cls");
            puts("Done...");
        }

теперь вызывая рид, получаю:

выводит много много раз.. раз 20 мб а то и более вроде как поля структуры.. входные данные:

eugen se se 1

выходные:

*■∟·n se se 1
se se 1
e╖ se se 1
se se 1
se se 1
¤⌂ se se 1
se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1
╠╠╠╠n se se 1



Для продолжения нажмите любую клавишу . . .
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 19:56 29
значит так вызываешь. я проверял
это
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
#include <stdio.h>
 
typedef struct student
{
    char name[40];
    char addr[50];
    char dateofb[20];
    int score;
}st;
 
const char* def = "file.txt";
 
void add()
{
    int i,k;
    st group;
 
    puts("Now you can add some students to the base");
    puts("\n Please, type, how many students you wish to add?\n");
    scanf("%d",&i);
    puts("\n");
 
    for(k=0;k<i;k++)
    {       
        FILE *fin=fopen(def,"a+b");
 
        puts("\nEnter name:\n");                                
        scanf("%39s", group.name);
 
        puts("\nEnter addres:\n");                      
        scanf("%49s", group.addr);
 
        puts("\nEnter date of birth:\n");                            
        scanf("%19s", group.dateofb);
 
        puts("\nEnter <score>:\n");                             
        scanf("%d", &group.score);
 
        fwrite(&group,sizeof(group),1,fin);
        fclose(fin);
    }
 
    system("cls");
    puts("Done...");
}
 
void print()
{       
    st group;
    FILE *fin=fopen(def,"rb");
    while(!feof(fin))
    {
        if(!fread(&group, sizeof group, 1, fin))
            break;
        printf("%s %s %s %d\n", group.name, group.addr
            , group.dateofb, group.score);
    }
    puts("\n\n");
    fclose(fin);
}
 
int main()
{
    add();
    print();
    return 0;
}
. у меня все ок

Добавлено через 1 минуту
group у тебя указатель!! перепиши
C
1
fread(group,sizeof(*group),1,fin);
C
1
fwrite(group,sizeof(*group),1,fin);
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 20:06  [ТС] 30
Собственно, теперь:

вход:
2 студента

eugen s s 1
no da da 2

выход:

*■eugen ╠╠s ╠╠s 183500
╠╠da ╠╠da 249036



Для продолжения нажмите любую клавишу . . .
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 20:13 31
не знаю, что у тебя в итоге с кодом. ищи глупые ошибки с указателями
1
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 20:20  [ТС] 32
спасибо огромное за помощь!) уже хотя бы не набор буков!) думаю сейчас подбором разберусь..
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 20:26 33
посмотри еще раз на код под катом (рабочий) в этом посте и сравни со своим. там не указатели на структуру, но адаптировать не сложно.
вот ввод/вывод того кода
0
Миниатюры
Сохранение структуры в бинарно-открытый файл. Кто подскажет?   Сохранение структуры в бинарно-открытый файл. Кто подскажет?  
Russian_Dragon
10 / 11 / 2
Регистрация: 18.02.2012
Сообщений: 140
26.02.2012, 20:29 34
Сохранить и восстановить класс/структуру очень легко. Даже можно пользоваться потоковыми операторами ввода/вывода [>>/<<].

Делается это так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
class MyClass{
int a;
}
 
void main(){
...
unsigned __int8 *mas;
MyClass MC1; 
mas = &MC1;//вроде и так сойдет, но если заортачиться компилятор, то делаем так
//(void*)mas = (void*)&MC1;
 
for(int i = 0; i < sizeof(MC1); i++)
ofile << mas[i];
 
//читаем
mas = new unsigned __int8[sizeof(MC1)];
for(int i = 0; i < sizeof(MC1); i++)
ifile >> mas[i];
MC1 = *((MyClass*)((void*)mas));
}
Это самый простой вариант, можно и более интересный сделать с malloc, memcpy и file.
Если хочешь дам свой класс, который сохранят любые классы в файл с использованием одной функции.
0
DU
1489 / 1135 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2012, 20:33 35
у вас способ хачный. на плюсах это можно делать без подобного рода кастов.
да и "любые" - это тоже неверно. только POD типы так можно сохранять\восстанавливать.

Вот собственно функции записи\чтения любых POD объектов, но без хаков с кастами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename PodType>
bool Write(FILE* file, const PodType& obj)
{
  const size_t written = fwrite(&obj, sizeof(obj), 1, file);
  return written == 1;
}
 
template <typename PodType>
bool Read(FILE* file, PodType& obj)
{
  const size_t read = fread(&obj, sizeof(obj), 1, file);
  return read == 1;
}
1
Russian_Dragon
10 / 11 / 2
Регистрация: 18.02.2012
Сообщений: 140
26.02.2012, 20:38 36
Цитата Сообщение от DU Посмотреть сообщение
только POD типы так можно сохранять\восстанавливать.
Тут я немного не соглашусь. У POD ограничения слишком строги.
Так можно сохранить и успешно восстановить классы без указате6лей и виртуальных функций.
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 20:40  [ТС] 37
даа, сделал!) retmas, в чем загвоздка была.. я твой код себе вставил, и результаты уже с него были... потом удалил файлик и новый создал.. я там просто кучу раз пробовал кодировку менять, мб из-за этого вот были лишние символы! всё работает! Всем спасибо огромное за помощь!)))
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 20:42 38
Eugen-S, просто видимо в старом файле данные были испорченные(из-за не правильной предыдущей записи) и их ты считывал.
0
DU
1489 / 1135 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2012, 20:43 39
Тут я немного не соглашусь. У POD ограничения слишком строги.
Так можно сохранить и успешно восстановить классы без указате6лей и виртуальных функций.
и еще без мемберов, у которых эти указатели могут присутствовать. Т.е. POD типы. Ну разве что мембер функции и таких классов могут присутствовать. Например классы с std::string мембером уже не сериализуются как надо. Т.е. такого рода сериалайзеры сильно ограниченны в своих возможностях.
0
Russian_Dragon
10 / 11 / 2
Регистрация: 18.02.2012
Сообщений: 140
26.02.2012, 20:44 40
Цитата Сообщение от DU Посмотреть сообщение
Вот собственно функции записи\чтения любых POD объектов, но без хаков с кастами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename PodType>
bool Write(FILE* file, const PodType& obj)
{
  const size_t written = fwrite(&obj, sizeof(obj), 1, file);
  return written == 1;
}
 
template <typename PodType>
bool Read(FILE* file, PodType& obj)
{
  const size_t read = fread(&obj, sizeof(obj), 1, file);
  return read == 1;
}
О, классно, а я с массивами мучился
0
26.02.2012, 20:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2012, 20:44

Сохранение структуры в файл
Подскажите если дана структура из трех полей как сохранить ее в файл и...

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

Сохранение в файл структуры
Здравствуйте. Никак не получается сохранить структуру в текстовый файл. Вот код...


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

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

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