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

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

Войти
Регистрация
Восстановить пароль
 
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
#1

Считывание данных из бинарного файла - C++

12.04.2010, 17:27. Просмотров 1042. Ответов 10
Метки нет (Все метки)

Доброго времени суток.
Моя проблема уже была озвучена в теме.

Вот листинг функции которая должна считывать данные из бинарного файла.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DLL_import int LoadList(const char *name)
{
      FILE *f = fopen(name, "rb");
if(!f){
    puts("Can't open file!");
    return 0;
  }
  fseek(f,0,SEEK_END);
  cnt = ftell(f);
  fseek(f,0,SEEK_SET);
  if(cnt % sizeof(Comp)){
    puts("Incorrect file!");
    fclose(f);
    return 0;
  }
  cnt /= sizeof(Comp);
  fread(list, sizeof(Comp), cnt, f);
  fclose(f);
  return 1;
 
}
Когда файл пустой и данные вводятся с клавиатуры все прекрасно работает, но если файл имеет записи, то ошибка прерывает программу.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2010, 17:27     Считывание данных из бинарного файла
Посмотрите здесь:

Считывание из бинарного файла в массив_не работает! C++
C++ Считывание из бинарного файла и занисение в список
Считывание класса с виртуальным наследованием из бинарного файла C++
Считывание строки из бинарного файла в string C++
Запись и считывание из бинарного файла C++
Считывание бинарного файла C++
Считывание структуры из бинарного файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
12.04.2010, 17:58     Считывание данных из бинарного файла #2
вместо "rb" "a+b" пробовали исп?
p.s сделайте проверку на существование файла.
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
12.04.2010, 18:02  [ТС]     Считывание данных из бинарного файла #3
попробовал a+b , не помогло

проверка на существование файла

C++
1
2
3
4
if(!f){
    puts("Can't open file!");
    return 0;
  }
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
12.04.2010, 18:05  [ТС]     Считывание данных из бинарного файла #4
Считывание данных из бинарного файла
вот ошибка
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
12.04.2010, 18:07     Считывание данных из бинарного файла #5
если надо добавить запись в конец файла исп а+b при wb старые записи должны удалятся.
P.s какой файл загрузится если я введу 2 одинаковых имени.На картинке ощибка что где то что то не то выделили .И что за переменная list?
fread(list, sizeof(Comp), cnt, f); и где задается сnt?
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
12.04.2010, 18:09  [ТС]     Считывание данных из бинарного файла #6
вот полный листинг dll модуля
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define DLL_import extern "C" __declspec(dllexport) 
 
typedef struct
{
    char name[15], mark[15];
    int price, num;
} Comp;
 
 
Comp *list = NULL;
int cnt = 0;
 
DLL_import int Add(Comp val)
{
    Comp *tmp = (Comp *) calloc(cnt+1, sizeof(Comp));
    if(!tmp) return 0;
    if(cnt) memcpy(tmp, list, cnt*sizeof(Comp));
    tmp[cnt] = val;
    cnt++;
    if(list) free(list);
    list = tmp;
    return 1;
}
 
DLL_import int Ins(int ind)
{
    if(ind < 0) ind = 0;
    Comp *tmp = (Comp *) calloc(cnt+1, sizeof(Comp));
    if(!tmp) return 0;
    memcpy(tmp, list, ind*sizeof(Comp));
    Comp val;
    char str[100];
    fflush(stdin);
    fgets(str, 99, stdin);
    if(strcmp(str,"") == 0) return 0;
    if(sscanf(str,"%s %s %u %u ", &val.name, &val.mark, &val.price, &val.num) == 4) tmp[ind] = val;
    memcpy(&tmp[ind+1], &list[ind], (cnt-ind)*sizeof(Comp));
    cnt++;
    free(list);
    list = tmp;
    return 1;
}
 
DLL_import void Destroy(void)
{
    if(list) free(list);
    list = NULL;
    cnt = 0;
}
 
DLL_import int Del(int ind)
{
    if((ind<0)||(ind>=cnt)) return 1;
    if(cnt == 1)
    {
        Destroy();
        return 0;
    }
    Comp *tmp = (Comp *) calloc(cnt-1, sizeof(Comp));
    memcpy(tmp, list, ind*sizeof(Comp));
    memcpy(&tmp[ind], &list[ind+1], (cnt-ind-1)*sizeof(Comp));
    cnt--;
    free(list);
    list = tmp;
    return 1;
}
 
DLL_import int LoadList(const char *name)
{
      FILE *f = fopen(name, "a+b");
if(!f){
    puts("Can't open file!");
    return 0;
  }
  fseek(f,0,SEEK_END);
  cnt = ftell(f);
  fseek(f,0,SEEK_SET);
  if(cnt % sizeof(Comp)){
    puts("Incorrect file!");
    fclose(f);
    return 0;
  }
  cnt /= sizeof(Comp);
  fread(list, sizeof(Comp), cnt, f);
  fclose(f);
  return 1;
 
}
 
//DLL_import int LoadList(const char *name)
//{
//  FILE *file = fopen(name, "r");
//  if(!file) return 1;
//  while(!feof(file))
//  {
//      Comp val;
//      int res = 1;
//      if(fscanf(file, "%s %s %u %u", &val.name, &val.mark, &val.price, &val.num) == 4) res = Add(val);
//      if(!res)
//      {
//          fclose(file);
//          return 2;
//      }
//  }
//
//  fclose(file);
//  return 0;
//}
 
DLL_import void Viev(void)
{
    if(cnt)
    {
        for(int i = 0; i < cnt; i++)
        {
            printf("%s [%s] %u %u\n", list[i].name, list[i].mark, list[i].price, list[i].num);
        }
    }
}
 
DLL_import int Input_StdIn(void)
{
    Comp val;
    char str[100];
    fflush(stdin);
    fgets(str, 99, stdin);
    if(strcmp(str,"") == 0) return 0;
    if(sscanf(str,"%s %s %u %u ", &val.name, &val.mark, &val.price, &val.num) == 4) Add(val);
    return 1;
}
 
DLL_import int SaveList(const char *name)
{ 
  FILE *f = fopen(name, "wb");
  if(!f) 
        {
        puts("File is not open!");
        return 0;}
  if(fwrite(list, sizeof(Comp), cnt, f) != cnt) { puts("Success writing to file!"); return 0;}
  fclose(f);
  return 1;
}
 
DLL_import int Edit(int ind)
{
    if((ind<0)||(ind>=cnt)) return 1;
    Ins(ind);
    Del(ind+1);
    return 1;
}
 
DLL_import int Menu(void)
{
    printf("Viberite deystvie:\n");
    printf("1 - Dobavit zapis\n");
    printf("2 - Vivesti soderzhimoe na ekran\n");
    printf("3 - Udalit zapis\n");
    printf("4 - Redaktirovat zapis\n");
    printf("0 - Vihod\n");
    int i;
    scanf("%d", &i);
    switch(i)
    {
    case 1:{printf("Vvedite zapis:\n"); Input_StdIn(); Menu(); break;}
    case 2:{Viev(); Menu(); break;}
    case 3:{int n; printf("Vvedite zapis kotoruyu hotite udalit\n"); scanf("%d", &n); Del(n); Viev(); Menu(); break;}
    case 4:{int n; printf("Vvedite zapis kotoruyu hotite redaktirovat\n"); scanf("%d", &n); Edit(n); Menu(); break;}
    case 0:{return 0;}
    }
}
 
 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
12.04.2010, 18:29     Считывание данных из бинарного файла #7
fread(list,sizeof(comp),1,f); попробуйте.
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
12.04.2010, 18:38  [ТС]     Считывание данных из бинарного файла #8
Цитата Сообщение от Sekt Посмотреть сообщение
fread(list,sizeof(comp),1,f); попробуйте.
Та же ошибка. Когда прогнал через дебагер убедился что ошибка именно в этой строке, но так и не могу разобраться почему...
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
12.04.2010, 18:47     Считывание данных из бинарного файла #9
fread(list,sizeof(comp),1,f)
и после вывод на екран
printf("....",list.name...);P.s Попробуйте fprintf.
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
12.04.2010, 19:04  [ТС]     Считывание данных из бинарного файла #10
объясните пожалуйста смысл этих действий. после считывания вывести на экран то что считали? но ведь это никак не повлияет на считывание из файла. а fprintf это если я правильно понимаю финкция вывода из текстового файла, но мы то работаем с бинарным...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2010, 20:10     Считывание данных из бинарного файла
Еще ссылки по теме:

Считывание из бинарного файла и запись данных в две строковых переменные C++
C++ Чтение данных из бинарного файла
Считывание бинарного файла C++
C++ Считывание из бинарного файла
Считывание из бинарного файла в структуру с последующим выводом C++

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

Или воспользуйтесь поиском по форуму:
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
12.04.2010, 20:10     Считывание данных из бинарного файла #11
C
1
2
3
4
5
6
while(1){
if(sizeof(list)!=fread(&list,sizeof(list),1,f)
break;
else
//...//
}//
Должно работать.
P.s не fprintf а fscanf().И почему тока для текстовых?
Yandex
Объявления
12.04.2010, 20:10     Считывание данных из бинарного файла
Ответ Создать тему
Опции темы

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