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

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

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

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

12.04.2010, 17:27. Просмотров 1067. Ответов 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;
 
}
Когда файл пустой и данные вводятся с клавиатуры все прекрасно работает, но если файл имеет записи, то ошибка прерывает программу.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2010, 17:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считывание данных из бинарного файла (C++):

Считывание из бинарного файла и запись данных в две строковых переменные - C++
Мне нужно считать две строки из бинарного файла "input.txt" и запихать их в переменные типа string. Открываю файлfopen("input.txt",...

Считывание бинарного файла - C++
Здравствуйте! Изначально нужно было прочитать почисленно текстовый файл и забить его в массив. Но т.к. это не получилось, решил прочитать...

Считывание из бинарного файла - C++
СЧИТАТЬ ИЗ БИНАРНОГО ФАЙЛА ВСЕ ВЕЩЕСТВЕННЫЕ ЧИСЛА В МАССИВ И ВЫВЕСТИ ЕГО НА ЭКРАН. #include <iostream> #include <fstream> #include...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
12.04.2010, 17:58 #2
вместо "rb" "a+b" пробовали исп?
p.s сделайте проверку на существование файла.
0
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;
  }
0
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
12.04.2010, 18:05  [ТС] #4
Считывание данных из бинарного файла
вот ошибка
0
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?
0
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;
}
0
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
12.04.2010, 18:29 #7
fread(list,sizeof(comp),1,f); попробуйте.
0
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
12.04.2010, 18:38  [ТС] #8
Цитата Сообщение от Sekt Посмотреть сообщение
fread(list,sizeof(comp),1,f); попробуйте.
Та же ошибка. Когда прогнал через дебагер убедился что ошибка именно в этой строке, но так и не могу разобраться почему...
0
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.
0
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
12.04.2010, 19:04  [ТС] #10
объясните пожалуйста смысл этих действий. после считывания вывести на экран то что считали? но ведь это никак не повлияет на считывание из файла. а fprintf это если я правильно понимаю финкция вывода из текстового файла, но мы то работаем с бинарным...
0
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().И почему тока для текстовых?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2010, 20:10
Привет! Вот еще темы с ответами:

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

Считывание из бинарного файла в массив_не работает! - C++
у меня есть большая программа, где я работаю с бинарными файлами, содержащими список студентов...так вот, я создала бин файл со...

Считывание строки из бинарного файла в string - C++
Привет всем!! Помогите новичку понять почему происходит ошибка при считывании строки из файла. void LoadFile() { string j; ...

Считывание из бинарного файла в структуру с последующим выводом - C++
В бинарном файле храниться инфа: Имя_пользователя дата_подключения номер Имя_пользователя дата_подключения номер и т.д. Есть...


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

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

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