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

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

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

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

12.04.2010, 17:27. Просмотров 1065. Ответов 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++
Мне нужно считать две строки из бинарного файла "input.txt" и запихать их в переменные типа string. Открываю файлfopen("input.txt",...

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

Считывание бинарного файла - 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 сделайте проверку на существование файла.
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++
Здравствуйте, уважаемые форумчане. Столкнулся с проблемой считывания из бинарного файла. Только вот не с самим считыванием, а занесением...

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

Считывание из бинарного файла в структуру с последующим выводом - 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