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

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

Войти
Регистрация
Восстановить пароль
 
FreeYourMind
136 / 136 / 55
Регистрация: 13.11.2016
Сообщений: 380
#1

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

08.05.2017, 20:25. Просмотров 308. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Считывание структур из бинарного файла в динамический массив (C++):

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

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

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

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется - C++
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

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

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

7
Max Dark
шКодер самоучка
1874 / 1674 / 608
Регистрация: 09.10.2013
Сообщений: 3,719
Записей в блоге: 6
Завершенные тесты: 2
08.05.2017, 20:34 #2
Цитата Сообщение от FreeYourMind Посмотреть сообщение
Person X;
как данная структура объявлена?
0
Даценд
Модератор
Эксперт .NET
4039 / 3878 / 1953
Регистрация: 20.04.2015
Сообщений: 7,042
08.05.2017, 20:39 #3
FreeYourMind,
Могу ошибаться, но не читаются ли все данные из файла в цикле while?
1
FreeYourMind
136 / 136 / 55
Регистрация: 13.11.2016
Сообщений: 380
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
шКодер самоучка
1874 / 1674 / 608
Регистрация: 09.10.2013
Сообщений: 3,719
Записей в блоге: 6
Завершенные тесты: 2
08.05.2017, 20:45 #5
FreeYourMind, как сказал Даценд вы пытаетесь считать файл несколько раз.
1й раз - когда определяете размер.
2й и последующие чтения - в цикле заполнения элементов массива. естественно это не удается, так как файл уже прочитан и позиция для чтения находится вне файла.
1
FreeYourMind
136 / 136 / 55
Регистрация: 13.11.2016
Сообщений: 380
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
шКодер самоучка
1874 / 1674 / 608
Регистрация: 09.10.2013
Сообщений: 3,719
Записей в блоге: 6
Завершенные тесты: 2
08.05.2017, 21:06 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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
136 / 136 / 55
Регистрация: 13.11.2016
Сообщений: 380
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++
Здравствуйте, Помогите пожалуйста найти проблему, мне нужно вначале записать текст в бинарный файл а затем считать его, записывает...

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

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

Считывание данных из бинарного файла - C++
Доброго времени суток. Моя проблема уже была озвучена в теме. Вот листинг функции которая должна считывать данные из бинарного...


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

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

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