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

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

Восстановить пароль Регистрация
 
ioscat
0 / 0 / 0
Регистрация: 07.05.2014
Сообщений: 44
09.07.2014, 11:57     Чтение файла в структуру #1
Всем привет!
Есть бинарный файл 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
olper
24 / 24 / 11
Регистрация: 02.12.2013
Сообщений: 75
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)
ioscat
0 / 0 / 0
Регистрация: 07.05.2014
Сообщений: 44
09.07.2014, 12:16  [ТС]     Чтение файла в структуру #3
http://habrahabr.ru/post/142662/
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
09.07.2014, 12:28     Чтение файла в структуру #4
Зачем цикл? Ты читаешь по 5 байт, а позицию чтения сдвигаешь на 1.
ioscat
0 / 0 / 0
Регистрация: 07.05.2014
Сообщений: 44
09.07.2014, 13:28  [ТС]     Чтение файла в структуру #5
цикл просто для анализа, просто поглядеть
AlexVRud
420 / 149 / 37
Регистрация: 04.07.2014
Сообщений: 421
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]
uglyPinokkio
325 / 228 / 41
Регистрация: 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)

В данном случае оно не просто имеет смысл, а обязательно.
ioscat
0 / 0 / 0
Регистрация: 07.05.2014
Сообщений: 44
10.07.2014, 13:13  [ТС]     Чтение файла в структуру #8
Спасибо всем! =)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2014, 13:52     Чтение файла в структуру
Еще ссылки по теме:

Чтение из файла в список (двунаправленный), используя структуру C++
C++ Построчное чтение из файла в структуру
Чтение данных из файла в структуру C++
C++ Чтение данных из файла в структуру
Чтение данных из текстового файла в структуру C++

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

Или воспользуйтесь поиском по форуму:
Мотороллер
10.07.2014, 13:52     Чтение файла в структуру
  #9

Не по теме:

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

Yandex
Объявления
10.07.2014, 13:52     Чтение файла в структуру
Ответ Создать тему
Опции темы

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