Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
FreeYourMind
137 / 137 / 104
Регистрация: 13.11.2016
Сообщений: 381
1

Считывание структур из бинарного файла в динамический массив

08.05.2017, 20:25. Просмотров 1012. Ответов 7
Метки нет (Все метки)

Доброго времени суток, форумчане, помогите пожалуйста, поделитесь знаниями или мне глаза откройте.. пишу программу(визуальное приложение) все работает за исключением одного момента.. есть обработчик, и в момент его запуска у меня должно происходить считывание из бинарного файла в дин. массив структур.. но по непонятным мне причинам туда считывается не пойми что.. вот фрагмент кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Person X;
             FILE *f;
             f=fopen(StrToChar(fileName), "rb");
             int n = 0;
             while(fread(&X, sizeof(X), 1, f))
                 n++;
             Person *arr = new Person [n];
             for (int i=0; i<n; i++)
             {
                 while(fread(&X, sizeof(X), 1, f))
                 {
                 strcpy(arr[i].pname, X.pname);
                 strcpy(arr[i].psname, X.psname);
                 strcpy(arr[i].pcode, X.pcode);
                 strcpy(arr[i].paddress, X.paddress);
                 strcpy(arr[i].arrDate, X.arrDate);
                 strcpy(arr[i].pbirth, X.paddress);
                 }
                 dataGridView1->Rows->Add(CharToStr(arr[i].pname), CharToStr(arr[i].psname),
                 CharToStr(arr[i].pcode), CharToStr(arr[i].pbirth), CharToStr(arr[i].paddress), CharToStr(arr[i].arrDate));
             }
помогите пожалуйста поправить этого зверя
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2017, 20:25
Ответы с готовыми решениями:

Нужно сохранить и прочитать динамический массив структур из бинарного файла
struct city{ char name_city; char metro; int year_city; int naselenie; ...

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

Считывание из файла в массив структур
Доброго времени суток! Есть структура: struct iDiscipline{ char name;...

Считывание файла в динамический массив построчно
Все мои варианты зависали или вылетали при большом колличество слов в файле.....

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

7
Max Dark
шКодер самоучка
1970 / 1746 / 861
Регистрация: 09.10.2013
Сообщений: 3,855
Записей в блоге: 6
Завершенные тесты: 2
08.05.2017, 20:34 2
Цитата Сообщение от FreeYourMind Посмотреть сообщение
Person X;
как данная структура объявлена?
0
Даценд
Модератор
Эксперт .NET
4286 / 4017 / 2661
Регистрация: 20.04.2015
Сообщений: 7,304
08.05.2017, 20:39 3
FreeYourMind,
Могу ошибаться, но не читаются ли все данные из файла в цикле while?
1
FreeYourMind
137 / 137 / 104
Регистрация: 13.11.2016
Сообщений: 381
08.05.2017, 20:44  [ТС] 4
Max Dark, структура объявлена так
C++
1
2
3
4
5
struct Person
{
    char pname[50], pbirth[30], psname[50], paddress[100], arrDate[30];
    char pcode[15];
};
Добавлено через 3 минуты
Даценд, если быть честным, то на самом деле я не понимаю что там и откуда читается, ибо другой обработчик (показать список из файла) работает правильно и считывает и выводит все в датагрид как надо, а вот в этом обработчике (поиск конкретной записи) я пытаюсь проверить как считываются данные в массив а на выходе у меня только ННННННННН на всех полях. вот и думаю где ошибка
0
Max Dark
шКодер самоучка
1970 / 1746 / 861
Регистрация: 09.10.2013
Сообщений: 3,855
Записей в блоге: 6
Завершенные тесты: 2
08.05.2017, 20:45 5
FreeYourMind, как сказал Даценд вы пытаетесь считать файл несколько раз.
1й раз - когда определяете размер.
2й и последующие чтения - в цикле заполнения элементов массива. естественно это не удается, так как файл уже прочитан и позиция для чтения находится вне файла.
1
FreeYourMind
137 / 137 / 104
Регистрация: 13.11.2016
Сообщений: 381
08.05.2017, 21:04  [ТС] 6
Max Dark, то есть если я перебирусь в начало (или закрою первое чтение файла) оно должно работать?

Добавлено через 12 минут
вроде бы начинает что то вырисовываться, но немного далековато до идеала. код чуть чуть поправил на
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
Person X;
             FILE *f;
             f=fopen(StrToChar(fileName), "rb");
             int n = 0;
             while(fread(&X, sizeof(X), 1, f))
                 n++;
             
             Person *arr = new Person [n];
             for (int i=0; i<n; i++)
             {
                 fread(&X, sizeof(X), 1, f);
                 fseek(f, sizeof(X)*i,SEEK_SET);
                ///* while(fread(&X, sizeof(X), 1, f))
                // {
                 strcpy(arr[i].pname, X.pname);
                 strcpy(arr[i].psname, X.psname);
                 strcpy(arr[i].pcode, X.pcode);
                 strcpy(arr[i].paddress, X.paddress);
                 strcpy(arr[i].arrDate, X.arrDate);
                 strcpy(arr[i].pbirth, X.paddress);
                // }*/
                 dataGridView1->Rows->Add(CharToStr(arr[i].pname), CharToStr(arr[i].psname),
                 CharToStr(arr[i].pcode), CharToStr(arr[i].pbirth), CharToStr(arr[i].paddress), CharToStr(arr[i].arrDate));
             }
вот правда теперь в некоторые поля что то не то пишется.. ну начало положено
0
Max Dark
шКодер самоучка
1970 / 1746 / 861
Регистрация: 09.10.2013
Сообщений: 3,855
Записей в блоге: 6
Завершенные тесты: 2
08.05.2017, 21:06 7
Лучший ответ Сообщение было отмечено FreeYourMind как решение

Решение

Цитата Сообщение от FreeYourMind Посмотреть сообщение
оно должно работать?
Но будет как то ... криво.
Добавим функцию определения размера файла
C++
1
2
3
4
5
6
7
8
9
long int get_file_size(FILE* f)
{
    long int curr_pos, end_pos;
    curr_pos = ftell(f);
    fseek(f, 0, SEEK_END);
    end_pos = ftell(f);
    fseek(f, curr_pos, SEEK_SET);
    return end_pos;
}
и перепишем ваш код с её использованием
C++
1
2
3
4
5
6
7
8
9
FILE *f = fopen(StrToChar(fileName), "rb");
long int n = get_file_size(f) / sizeof(Person);
Person *arr = new Person [n];
for (int i = 0; i<n; i++)
{
 fread(&(arr[i]), sizeof(Person), 1, f);
 dataGridView1->Rows->Add(CharToStr(arr[i].pname), CharToStr(arr[i].psname),
 CharToStr(arr[i].pcode), CharToStr(arr[i].pbirth), CharToStr(arr[i].paddress), CharToStr(arr[i].arrDate));
}

Не по теме:

только я теперь не вижу смысла в этом динамическом массиве...

1
FreeYourMind
137 / 137 / 104
Регистрация: 13.11.2016
Сообщений: 381
08.05.2017, 21:17  [ТС] 8
Max Dark, идея программы такова - запись и хранение информации о неких вооброжаемых людях, файл служит своего рода базой данных, а программа должна выполнять поиск этих персонажей по различным полям (имя или год рождения ну и т.д.) ну и пока мой кругозор не столь велик додумался реализовать этот поиск через создание дин. массива и искать через него.. хотя я наверное усложняю.. если есть другой вариант решения (более простой) я бы с радостью его использовал, ибо понимаю что если в БД 1000 записей то это существенно начнет кушать ресурс
0
08.05.2017, 21:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2017, 21:17

Считывание матрицы из файла и запись в динамический массив
Есть файл c n-количеством матриц и нужно считать их. И записать их элементы в...

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

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание...


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

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

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