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

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

26.02.2012, 17:50. Просмотров 2000. Ответов 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, 18:02 2
для начала покажите свою структуру
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 18:37  [ТС] 3
C
1
2
3
4
5
6
typedef struct student  {
                    char name[40];
                    char addr[50];
                    char dateofb[20];
                    int score;
                        }st;
0
DU
1488 / 1134 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2012, 18:42 4
такое возможно. нужно бинарно с поток слить ее, имея ее размер и указатель на нее.
в псевдокоде это будет примерно так:

C++
1
2
student st;
file.write(&st, sizeof(st)); // в файл запишутся байты, которые начинаются с &st в количетве, равным размеру этой структуры.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 18:44 5
C
1
fwrite(&st, sizeof st, 1, fin);
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 18:46  [ТС] 6
так у меня fwrite..
тогда будет что-то типа:

fwrite(&group,sizeof(group),1,fin);

??

Я вот сделал так, в файл записались какие-то символы... + через функцию:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void print()
        {   
            char buff[50];
            int i=0;
            FILE *fin=fopen(def,"rb");
 
            while(!feof(fin))
            {   
                for(i=0;i!=49;i++) buff[i]=0;
 
                fread(buff,sizeof(buff)-1,1,fin);
                printf("%s",buff);
                    
            }
 
            puts("\n\n");
            fclose(fin);
        }
Которая должна читать из этого же файла "базу", выводит тоже те же символы которые записались..

Какой должен быть формат файла? у меня Юникод вроде стоит..
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 18:48 7
записывал sizeof group - читай sizeof group
C
1
fread(&group, sizeof group, 1, fin);
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 18:53  [ТС] 8
не, та же борода.. , к тому же , если сразу с запуска кода выбрать ф-цию считывания, считывает нелепые символы.. , хотя файл пуст..

Добавлено через 1 минуту
проблема в том что он никак не может сохранить структуру адекватно.. в файл вместо нормальных символов, которые я ввожу, пишутся всякие символы.. причем, я ввел допустим на всю структуру суммарно там 20 символов, типа (eugen sss eee 2), записались 3 разные символа, не совсем понятные..
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 18:56 9
Цитата Сообщение от Eugen-S Посмотреть сообщение
считывает нелепые символы.. , хотя файл пуст..
ну так проверять надо результат fread

Добавлено через 2 минуты
что-то в этом роде
C
1
2
3
4
5
6
size_t bytes_read = fread(&group, sizeof group, 1, fin);
if(bytes_read != sizeof group)
{
    perror("hooita");
    exit(1);
}
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 18:58  [ТС] 10
так а собственно , разве с ридом может быть проблема? у меня не выходит никак толково записать.. вот к примеру.. запускаю код, пишу:
name: eugen
addr: s
dofbirth: ttt
score: 2

в файл сохранилось:

"„ы0 "

вот я скопировал содержимое файла..

Добавлено через 1 минуту
ну и собственно в разной кодировке файла- разные символы там.. но толкового ничего так и не выводит
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 19:00 11
Цитата Сообщение от Eugen-S Посмотреть сообщение
в файл сохранилось:
"„ы0 "
чувак, ты реально собрался бинарный файл в блокноте просматривать?
и еще покажи что с кодом в иьоге вышло
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 19:02  [ТС] 12
так ф-ция которая бинарно считывает из того же файла, так и выводит мне эти же непонятные символы..

щас покажу целиком функции..

Добавлено через 50 секунд
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
typedef struct student  {
                    char name[40];
                    char addr[50];
                    char dateofb[20];
                    int score;
                        }st;
 
void print()
        {   
            char buff[sizeof(st)];
            int i=0;
            FILE *fin=fopen(def,"rb");
 
            while(!feof(fin))
            {   
                fread(buff,sizeof(buff)-1,1,fin);
                printf("%s",buff);  
            }
 
            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");
 
            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);
            }
 
            system("cls");
            puts("Done...");
        }
0
DU
1488 / 1134 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2012, 19:05 13
вроде писали уже, что читать нужно не в буфер чаров а в структуру и выводить на печать уже поля этой структуры. при чтении в буфер и последующем его выводе не удивительно, что там хлам.
после записи посмотри в хексе, что в файле. запиши туда одну структуру. размер файла после этого должен быть равен sizeof(st)
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 19:07  [ТС] 14
хм ,сейчас быстро попробую...
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 19:09 15
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void print()
{       
    struct st group;
    FILE *fin=fopen(def,"rb");
    while(!feof(fin))
    {
        size_t bytes_read = fread(&group, sizeof group, 1, fin);
        if(bytes_read == 0)
            break;
        if(bytes_read != sizeof group)
        {
            perror("hooita");
            exit(1);
        }
        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:19  [ТС] 16
Переделал чтение:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void print(st *buff)
        {   
            int i=0;
            FILE *fin=fopen(def,"rb");
 
            while(!feof(fin))
            {   
                fread(buff,sizeof(buff),1,fin);
                printf("%s",buff);  
            }
 
            puts("\n\n");
            fclose(fin);
        }
так? ну, уже хотя бы первое поле которое я заполняю - выдает, но перед ним куча мусора..

Добавлено через 12 секунд
сейчас.

Добавлено через 6 минут
видимо нужно зануллить поля структуры перед тем как заносить туда данные, ато оч много мусора.. сейчас попробую, может чуток "чище" будет, но всё еще не совсем то что надо выводит почему-то..

Добавлено через 2 минуты
Всё равно выводится куча мусора при вызове ф-ции чтения...
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 19:24 17
ерунда получается из-за того, что в ф-ии add() переменная group - уже указатель

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

сделал так, проверяю

Добавлено через 53 секунды
не.. теперь при вызове рид, выдало огроменную кучу мусора среди которого иногда проскакивали значения поля name..
0
DU
1488 / 1134 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2012, 19:31 19
вот простой пример. без проверок на ошибки и прочих нужный вещей. но он работает. т.е. проблема чтения записи в файл тут решена. адаптируй под свои нужды если надо.

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
#include <cstdio>
#include <cstring>
 
struct Student
{
  char name[40];
  char addr[50];
  char dateofb[20];
  int score;
};
 
bool Write(FILE* file, const Student& student)
{
  const size_t written = fwrite(&student, sizeof(student), 1, file);
  return written == 1;
}
 
bool Read(FILE* file, Student& student)
{
  const size_t read = fread(&student, sizeof(student), 1, file);
  return read == 1;
}
 
int main()
{
  {
    Student st;
    strcpy(st.name, "name");
    strcpy(st.addr, "addr");
    strcpy(st.dateofb, "dateofb");
    st.score = 666;
    FILE *file = fopen("d:\\file.txt","a+b");
    Write(file, st);
    fclose(file);
  }
 
  {
    Student st2;
    FILE* file = fopen("d:\\file.txt","rb");
    Read(file, st2);
    fclose(file);
    printf("name = %s\naddr = %s\ndateofb = %s\nscore = %d\n", st2.name, st2.addr, st2.dateofb, st2.score);
  }
 
  return 0;
}
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
26.02.2012, 19:34  [ТС] 20
спасибо, сейчас попробую разобраться
0
26.02.2012, 19:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2012, 19:34

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

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

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


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

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

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