Чтение uint8_t из двоичного файла

У меня есть файл с двоичными числами, и я должен их прочитать. Я использую:

ifstream data("date.txt", ios_base::binary);

int count_16 = 0; //count how many uint16_s I have already read
uint16_t numbers_16; // Allocate storage for uint16_s
int count_8 = 0;
uint8_t numbers_8;
int count_char = 0;
char name[20];

data.seekg(0U, ios_base::beg); // Move the input position indicator to the beginning of the file for reading
data.read(reinterpret_cast<char*>(&numbers_16), sizeof(uint16_t)); // into numbers_16
cout << numbers_16; 
count_16++;

data.seekg(count_16 * sizeof(uint16_t) + count_8 * sizeof(uint8_t) + count_char * sizeof(name+1));
data.read(reinterpret_cast<char*>(&numbers_16), sizeof(numbers_16)); // Read the element into number
cout << numbers_16 << endl;
count_16++;

все работает до тех пор, пока:

data.seekg(count_16 * sizeof(uint16_t) + count_8 * sizeof(uint8_t) + count_char * sizeof(name+1));
data.read(reinterpret_cast<char*>(&numbers_8), sizeof(numbers_8)); // Read the element into number
cout << numbers_8 << endl;
count_8++;

И здесь я не получаю ни числа, ни чего-либо читаемого. Я не знаю, почему этот метод работает для uint16_t, но не для uint8_t. Может кто-нибудь объяснить, почему это неправильно и как читать uint8_t из файла?

Вы можете опубликовать свой файл data.txt

nayab 15.03.2018 15:49

Числа в исходном формате или в тексте? Обычно расширение «.txt» означает текст ASCII, т.е. 0x31 вместо «1», а не 0x01.

Thomas Matthews 15.03.2018 17:23

Кстати, вам не нужно искать начало файла после его открытия (если вы не открываете его в режиме добавления); файл автоматически устанавливается в начало.

Thomas Matthews 15.03.2018 17:25

Согласно вашему коду, count_8 равен нулю, поэтому выражение count_8 * sizeof(uint8_t) также равно нулю. Я понимаю, почему вы перемещаете указатель файла. Ваша программа может быть более эффективной, если будет читать структуру или блок данных, а не искать следующий uint16_t.

Thomas Matthews 15.03.2018 17:28

Кстати, у count_char тоже ноль. Таким образом, вы ищете только count_16 * sizeof(uint16_t). Используйте отладчик.

Thomas Matthews 15.03.2018 17:29

Пожалуйста, опубликуйте формат или макет вашего входного файла.

Thomas Matthews 15.03.2018 17:30

ну, я не могу отправить вам входной файл, я написал в качестве примера «date.txt», файл имеет расширение, сделанное моим колледжем, и наверняка там только двоичные числа. И это только часть длинного кода, где я использую несколько циклов, и поэтому мне нужно написать count_char. И в файле есть различные переменные, поэтому я не могу просто прочитать блок данных из-за этого. Ну, мой вопрос, как читать uint_8 из двоичного файла?

Pal Kol 15.03.2018 21:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
1 781
1

Ответы 1

Оказалось, зачем читать. Единственная ошибка была здесь:

cout << numbers_8 << endl;

Я просто написал (int) перед numbers_8, и теперь все выглядит нормально.

Другие вопросы по теме