Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 4
1

Запись из структуры в файл и обратно

08.08.2015, 16:05. Показов 953. Ответов 7
Метки нет (Все метки)

Всем привет! Никак не могу нормально считать и записать з файла в структуру и обратно. Коды функций:

структура:

C++
1
2
3
4
5
6
7
struct hardware {
    int number;
    char name[25];
    int amoung;
    int price;
}HARDWARE;
    struct hardware arg;
Создание файла:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void filecreator (struct hardware par) {
    int count;
    
    if  (Ptr=fopen("hardware.txt", "r")==NULL) {
        printf ("File hardware.txt has been created\n\n");
        Ptr = fopen("hardware.txt", "w+");
        
        for (count=0; count<=99; count++) {
            fwrite (&count, sizeof(struct hardware), 1, Ptr);
        }
    }
     else
           printf ("File hardware.txt has been sucsesfully opened\n\n");
        
    fclose (Ptr);
    return;
}
Запись в файл:

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
void writefile (FILE *Ptr, struct hardware par) {
    //Перевірка чи файл доступний/створення при відсутності
    if  (Ptr=fopen("hardware.txt", "r+")==NULL) {
        printf ("OOPS, file hardvare.txt can`t be opened, i`ll try to create it\n\n");
        filecreator (arg);
    }
    //Зчитування значень до структури для запису в файл
    else {
        printf ("Enter name of good (not more 24 symbols): ");
        gets(arg.name);
 
        printf ("Enter number of the good: ");
        scanf  ("%d", &arg.number);
        
        printf ("Enter amoung of goods: ");
        scanf  ("%d", &arg.amoung);
        
        printf ("Enter price of good: ");
        scanf  ("%d", &arg.price);
    }
    //Вводимо значення комірки пам'яті та пишемо туди інформацію
    fseek (Ptr, (arg.number-1) * sizeof(struct hardware), SEEK_SET);
    fwrite (&arg.number, sizeof(arg), 1, Ptr);
   
    fclose(Ptr);    
}
Считать з файла:

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
void readfile (FILE *Ptr, struct hardware par) {
    struct hardware hard;
 
    //Перевірка чи файл доступний/створення при відсутності
    if  (Ptr=fopen("hardware.txt", "r+")==NULL) {
        printf ("OOPS, file hardvare.txt can`t be opened, i`ll try to create it\n\n");
        filecreator (arg);
    }
    //Зчитування значень до структури для друку
    else {
        printf ("Enter number of good: ");
        scanf  ("%d", &arg.number);
 
        fseek  (Ptr, (arg.number-1) * sizeof (struct hardware), SEEK_SET);
 
        fread  (&arg.number, sizeof(arg), 1, Ptr);
    
        printf ("Number %d\n", arg.number);
        printf ("Name %s\n", arg.name);
        printf ("Amoung %d\n", arg.amoung);
        printf ("Price %d\n", arg.price);
    }
    fclose(Ptr);        
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2015, 16:05
Ответы с готовыми решениями:

Запись структуры в файл - Как сделать так, чтобы в файл записывались только данные структуры?
Здравствуйте! using System.Runtime.Serialization.Formatters.Binary; public struct wav {...

Запись таблицы в файл и обратно
Добрый день! Как таблицу datagrid записать в файл, а потом из файла занести в другую datagrid?...

Запись в файл из массива объектов и чтение обратно в массив
Прошу помощи Приблизительно вот такой код class A { public int Element { get;...

Возведение большой матрицы, читаемой с файла, в степень N, и запись обратно в файл на C#
Доброго времени. Очень нужно написать программу на C#, которая прочитает с файла огромную матрицу с...

7
Клюг
7671 / 3186 / 382
Регистрация: 03.05.2011
Сообщений: 8,381
09.08.2015, 13:05 2
Дык, по умолчанию файл открывается в текстовом режиме, а вам надобно в двоичном: чтение - fopen("hardware.txt", "rb+"); запись "wb".
The global translation mode flag default is "text" unless you explicitly link your program with BINMODE.OBJ.
When neither "t" nor "b" is specified, the value of the global variable _fmode establishes whether the file is to treated as a binary or a text file. Unless this value is changed by the program or you have linked your program with BINMODE.OBJ, the default will be text mode.
0
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 4
10.08.2015, 23:31  [ТС] 3
Изменил, не помогло

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
70
71
72
void filecreator (struct hardware par) {
    int count;
    FILE *Filecr;
    
    struct hardware filewcreate = {0, "", 0, 0};    
 
    if  ((Filecr=fopen("hardware.dat", "wb+"))==NULL) {
        printf ("File hardware.dat has been created\n\n");
        Filecr = fopen("hardware.dat", "wb+");
        
        for (count=0; count<=99; count++) {
            fwrite (&count, sizeof(struct hardware), 1, Filecr);
        }
    }
    else
        printf ("File hardware.dat has been sucsesfully opened\n\n");
        
    fclose (Filecr);
    return;
}
 
void writefile (FILE *writePtr) {
 
    struct hardware writea;
 
    if  ((writePtr=fopen("hardware.dat", "rb+"))==NULL) {
        printf ("OOPS, file hardvare.dat can`t be opened.\n\n");
    }
 
    else {
        printf ("Enter name of good (not more 24 symbols): ");
        scanf  ("%s", &writea.name);
 
        printf ("Enter number of the good: ");
        scanf  ("%d", &writea.number);
        
        printf ("Enter amoung of goods: ");
        scanf  ("%d", &writea.amoung);
        
        printf ("Enter price of good: ");
        scanf  ("%d", &writea.price);
    
 
        fseek  (writePtr, (writea.number-1) * sizeof(struct hardware), SEEK_SET);
        fwrite (&writea, sizeof(struct hardware), 1, writePtr);
    }
    fclose(Ptr);    
}
 
void readfile (FILE *readPtr) {
    int num;
    struct hardware reada;
    
 
    if  ((readPtr=fopen("hardware.dat", "rb+"))==NULL) {
        printf ("OOPS, file hardvare.dat can`t be opened, i`ll try to create it\n\n");
    }
 
    else {
        printf ("Enter number of good: ");
        scanf  ("%d", &num);
 
        fseek  (readPtr, (num-1) * sizeof(struct hardware), SEEK_SET);
        fread  (&reada, sizeof(struct hardware), 1, readPtr);
    
        printf ("Number: %d\n", reada.number);
        printf ("Name: %s\n",   reada.name);
        printf ("Amoung: %d\n", reada.amoung);
        printf ("Price: %d\n",  reada.price);
    }
    fclose(readPtr);        
}
Добавлено через 9 часов 3 минуты
Не помогло(

Добавлено через 23 часа 51 минуту
Написал програму для проверки функций:
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
70
71
72
73
74
struct a{
    int aa;
    char b[10]; 
}aPtr;
 
void creator(FILE *, struct a parm);
void reading(FILE *, struct a parm);
void writing(FILE *, struct a parm);
 
main() {
    FILE *Ptr;
    struct a aas;
    aas.aa;
 
    creator(Ptr, aas);
 
    writing(Ptr, aas);
 
    reading(Ptr, aas);
}
 
void reading(FILE *Ptr, struct a parm) {
    int torea=0;
    struct a point;
    
    Ptr=fopen("testnew.dat", "rb+");
 
    printf ("Torea\n");
    scanf  ("%d", &torea);
 
    fseek  (Ptr, torea-1 * sizeof(struct a), SEEK_SET);    
    fread  (&point, sizeof(struct a), 1, Ptr);
 
    printf ("%d\n", point.aa);
    printf ("%s", point.b);
    
    fclose (Ptr);
}
 
void writing(FILE *Ptr, struct a parm) {
    int towr=0;
    struct a pointwr;
 
    Ptr=fopen("testnew.dat", "rb+");
    
    scanf  ("%s", pointwr.b);
    scanf  ("%d", &pointwr.aa);
    
    printf ("To wr\n");
    scanf  ("%d", &towr);   
    
    fseek  (Ptr, towr-1 * sizeof(struct a), SEEK_SET);
    fwrite (&pointwr, sizeof(struct a), 1, Ptr);
 
    fclose (Ptr);
}
 
void creator(FILE *Ptr, struct a parm) {
    int count;
    
    struct a pointcr;
    pointcr.aa=0;
    
    if  ((Ptr=fopen("testnew.dat", "rb+"))==NULL) {
        printf ("YES\n");
        Ptr=fopen("testnew.dat", "wb+");
        for (count=0; count<=99; count++) {
            fseek  (Ptr, count * sizeof(struct a), SEEK_SET);
            fwrite (&pointcr, sizeof(struct a), 1, Ptr);
        }           
    }
 
    fclose (Ptr);
}
Сначала пишу в 1 ячейку файла qwerty и 111111. Считываю, все норм. Потом не пишу в 2 ячейку и просто считываю из неё и получаю.............. werty и огромное число. Почему?
0
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
11.08.2015, 00:53 4
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include "stdafx.h"
 
#include <windows.h>
#include <stdio.h>
 
#define  MAX_RECORD_CNT          (100)
 
struct HARDWARE
{  
   int      number;
   char     name[25];
   int      amount;
   int      price;
};
 
static struct HARDWARE     hwArgs;
 
static char*   pszDBname = "hardware.dat";
 
static void CreateEmptyDB()
{
   struct HARDWARE     hwDummy;
 
   FILE*    pFile = fopen(pszDBname,"wb");
 
   if (!pFile)
   {
      // Error !
      printf("Can't open [%s].\n",pszDBname);
      return;
   }
 
   memset(&hwDummy,0,sizeof(struct HARDWARE));
 
   for (int ii = 0; ii < MAX_RECORD_CNT; ++ii)
   {
      hwDummy.number = ii;
 
      fwrite(&hwDummy,sizeof(struct HARDWARE),1,pFile);
   }
 
   fclose(pFile);
}
 
static void WriteRecord(struct HARDWARE* pRecord)
{
   FILE*    pFile = fopen(pszDBname,"rb+");
 
   if (!pFile)
   {
      // Error !
      printf("Can't open [%s].\n",pszDBname);
      return;
   }
 
   // One based RecNum !
   int      iOfs = (pRecord->number - 1) * sizeof(struct HARDWARE);
 
   if (fseek(pFile,iOfs,SEEK_SET))
   {
      // Error !
      printf("Can't seek DB file.\n");
      fclose(pFile);
      return;
   }
 
   if (fwrite(pRecord,sizeof(struct HARDWARE),1,pFile) != 1)
   {
      // Error !
      printf("Can't write DB file.\n");
      fclose(pFile);
      return;
   }
   
   fclose(pFile);
}
 
static void ReadRecord(struct HARDWARE* pRecord)
{
   FILE*    pFile = fopen(pszDBname,"rb+");
 
   if (!pFile)
   {
      // Error !
      printf("Can't open [%s].\n",pszDBname);
      return;
   }
 
   // One based RecNum !
   int      iOfs = (pRecord->number - 1) * sizeof(struct HARDWARE);
 
   if (fseek(pFile,iOfs,SEEK_SET))
   {
      // Error !
      printf("Can't seek DB file.\n");
      fclose(pFile);
      return;
   }
 
   if (fread(pRecord,sizeof(struct HARDWARE),1,pFile) != 1)
   {
      // Error !
      printf("Can't read DB file.\n");
      fclose(pFile);
      return;
   }
   
   fclose(pFile);
}
 
int main(int argc,char** argv)
{
   // One based RecNum !
   int      Idx = 55;
 
   hwArgs.number = Idx;
   hwArgs.amount = 10;
   hwArgs.price  = 100;
 
   strcpy(hwArgs.name,"Just for test.");
 
   CreateEmptyDB();
 
   printf("On write:\n");
   printf("Number: %d\n",hwArgs.number);
   printf("Name  : %s\n",hwArgs.name);
   printf("Amount: %d\n",hwArgs.amount);
   printf("Price : %d\n\n",hwArgs.price);
 
   WriteRecord(&hwArgs);
 
   memset(&hwArgs,0,sizeof(struct HARDWARE));
 
   hwArgs.number = Idx;
 
   ReadRecord(&hwArgs);
   
   printf("On read:\n");
   printf("Number: %d\n",hwArgs.number);
   printf("Name  : %s\n",hwArgs.name);
   printf("Amount: %d\n",hwArgs.amount);
   printf("Price : %d\n\n",hwArgs.price);
 
   return 0;
}
Миниатюры
Запись из структуры в файл и обратно  
0
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 4
11.08.2015, 01:36  [ТС] 5
А 56 елемени будет пустым?
0
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
11.08.2015, 01:48 6
CreateEmptyDB() инициализирует все записи их индексом. Остальные поля остаются пустыми, пока не будут явно перезаписаны.
Вложения
Тип файла: 7z hardware.dat.7z (1.2 Кб, 3 просмотров)
0
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 4
11.08.2015, 02:23  [ТС] 7
Не совсем понял как работают програмы записи и считывания

Добавлено через 5 минут
И что именно у меня не так?
0
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
11.08.2015, 02:27 8
Цитата Сообщение от Дима_Медвед Посмотреть сообщение
Не совсем понял
Запускаете в отладчике и проходите пошагово. Лучшего метода не существует.

что именно у меня не так
Все, пожалуй. Начиная стилем кода и именованием переменных, и кончая передачей структур по значению.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2015, 02:27

Запись в файл структуры
Есть структура Помогите реализовать запись в файл? Мой вариант не работает.......

Запись структуры в файл
имеется одномерный массив типа структуры base struct base { String name; String work; ...

Запись структуры в файл
Написать программу выдающую на печать следующую информацию: фамилию сборщика и общее количество...

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

запись структуры в файл
Здравствуйте. Мне очень нужна Ваша помощь. Надо написать программу обработки файла, состоящего из...

Запись структуры в файл
Что я не так делаю ?Облазил много тем и так и не понял почему оно не работает. int main(){ int...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru