Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 07.05.2014
Сообщений: 44
1

Чтение файла в структуру

09.07.2014, 11:57. Показов 548. Ответов 8
Метки нет (Все метки)

Всем привет!
Есть бинарный файл test.txt, в нём заголовок, который я пытаюсь прочитать в структуру, но что-то не идёт...
Содержание файла (от балды):
61 11 20 11 20 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0
код программы:
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
#include <iostream>
using namespace std;
 
struct MyStruct
{
    unsigned char c;
    unsigned int i;
};
 
int main()
{
    FILE * MyFile = fopen ("c:\\cpptest\\test.txt", "r");
 
    MyStruct a;
    a.c=0;a.i=0;
    int StructSize=5;
 
    for(int i = 0;i<10;i++)
    {
        fseek(MyFile,i,SEEK_SET);
        fread(&a,StructSize,1,MyFile);
        cout << a.c << "\t";
        cout << a.i << "\n";
    }
    
    fclose(MyFile);
}
Я ожидал, что первый байт пойдёт в Unsigned Char, а ещё 4 в Insigned Int. Но в него идёт почему-то только последний пятый байт.

Выдача:
q 14
Є 15
[ 16
. 240
♫ 240
☼ 240
► 240
Ё 240
Ё 240
Ё 240
Для продолжения нажмите любую клавишу . . .
Добавлено через 16 минут
Ошибка в тексте файла, первые 8 байт:
71 f2 5b 2e 0e 0f 10 f0 f0
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2014, 11:57
Ответы с готовыми решениями:

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

Чтение из файла в структуру
Здравствуйте, имеется функция чтения из файла в структуру и последующего вывода на экран: void...

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

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

8
27 / 26 / 16
Регистрация: 02.12.2013
Сообщений: 79
09.07.2014, 12:13 2
http://www.cplusplus.com/reference/cstdio/fopen/
In order to open a file as a binary file, a "b" character has to be included in the mode string.
попробуй
C++
1
FILE * MyFile = fopen ("c:\\cpptest\\test.txt", "rb");
лучше
C++
1
int StructSize=sizeof(MyStruct);
или
C++
1
int StructSize=sizeof(a);
и имеет смысл

C++
1
2
3
4
5
6
7
#pragma pack(push,1)
struct MyStruct
{
    unsigned char c;
    unsigned int i;
};
#pragma pack(pop)
1
1 / 1 / 1
Регистрация: 07.05.2014
Сообщений: 44
09.07.2014, 12:16  [ТС] 3
http://habrahabr.ru/post/142662/
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
09.07.2014, 12:28 4
Зачем цикл? Ты читаешь по 5 байт, а позицию чтения сдвигаешь на 1.
0
1 / 1 / 1
Регистрация: 07.05.2014
Сообщений: 44
09.07.2014, 13:28  [ТС] 5
цикл просто для анализа, просто поглядеть
0
672 / 288 / 99
Регистрация: 04.07.2014
Сообщений: 810
09.07.2014, 19:39 6
А кто тебе сказал что твоя структура занимает 5 байт?
При компиляции может (и будет) происходить выравнивание элементов структуры, например по 4-ре байта:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
struct MyStruct
{
    unsigned char c;
    unsigned int i;
};
 
int main()
{
    MyStruct m;
    std::cout << "Size = " << sizeof(MyStruct) << std::endl;
    std::cout << "ptr m  =" << &m << std::endl; 
    std::cout << "ptr m.i=" << &(m.i) << "(+" << ((int64_t)(&m.i)-(int64_t)(&m)) << ")" << std::endl;
    return 0; 
}
Т.е. в памяти будет выделятся 8-мь байт: [c][][][][i][i][i][i]
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
09.07.2014, 20:08 7
Цитата Сообщение от olper Посмотреть сообщение
и имеет смысл
C++
1
2
3
4
5
6
7
#pragma pack(push,1)
struct MyStruct
{
    unsigned char c;
    unsigned int i;
};
#pragma pack(pop)

В данном случае оно не просто имеет смысл, а обязательно.
1
1 / 1 / 1
Регистрация: 07.05.2014
Сообщений: 44
10.07.2014, 13:13  [ТС] 8
Спасибо всем! =)
0
Мотороллер
10.07.2014, 13:52     Чтение файла в структуру
  #9

Не по теме:

Цитата Сообщение от uglyPinokkio Посмотреть сообщение
В данном случае оно не просто имеет смысл, а обязательно.
вот же блин. а я два дня назад сидел и думал какого хера у меня байты сдвигаются при чтении бинаря в структуру ._. в итоге решил отказаться от структур (и от наглядности кода) и юзал оффсеты.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2014, 13:52

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Построчное чтение из файла в структуру
Всем доброго дня! Есть структура вида struct Product { char code; char name; double...

Чтение из бинарного файла в структуру
Собственно вопрос в заголовке, есть структура: struct StructEmployee {; int id; ...

Чтение из текстового файла в структуру
Всем привет, я новичок в C++. Испытав многое (безрезультатно) решил просить помощи у вас. Что...

Чтение данных из файла и запись в структуру
Не могу разобраться как реализовать чтение структуры из данных . Перечитал много всего, так и не...


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

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

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