У меня есть файл с двоичными числами, и я должен их прочитать. Я использую:
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 из файла?
Числа в исходном формате или в тексте? Обычно расширение «.txt» означает текст ASCII, т.е. 0x31 вместо «1», а не 0x01.
Кстати, вам не нужно искать начало файла после его открытия (если вы не открываете его в режиме добавления); файл автоматически устанавливается в начало.
Согласно вашему коду, count_8 равен нулю, поэтому выражение count_8 * sizeof(uint8_t) также равно нулю. Я понимаю, почему вы перемещаете указатель файла. Ваша программа может быть более эффективной, если будет читать структуру или блок данных, а не искать следующий uint16_t.
Кстати, у count_char тоже ноль. Таким образом, вы ищете только count_16 * sizeof(uint16_t). Используйте отладчик.
Пожалуйста, опубликуйте формат или макет вашего входного файла.
ну, я не могу отправить вам входной файл, я написал в качестве примера «date.txt», файл имеет расширение, сделанное моим колледжем, и наверняка там только двоичные числа. И это только часть длинного кода, где я использую несколько циклов, и поэтому мне нужно написать count_char. И в файле есть различные переменные, поэтому я не могу просто прочитать блок данных из-за этого. Ну, мой вопрос, как читать uint_8 из двоичного файла?





Оказалось, зачем читать. Единственная ошибка была здесь:
cout << numbers_8 << endl;
Я просто написал (int) перед numbers_8, и теперь все выглядит нормально.
Вы можете опубликовать свой файл data.txt