Почему Windows не может читать за пределами символа 0x1A (EOF), а Unix может?

Возможный дубликат:
Почему failbit установлен, когда eof on read? Есть ли выход?

Я пишу небольшую программу, и она прекрасно работала на Mac OS и Ubuntu (Unix …). Программа должна читать в файле данных и разделять байты (charс / unsigned charс) и memcpy() их в поплавки. Это будет включать процесс принятия, скажем, следующих четырех значений: & сдвинув их в 32бит int а затем копировать intпамять в float, Вот так:

0x43 0x66 0x1A 0x79 -> читать в int32 и memcpy () в float -> val = 230.103

Как я уже сказал, это прекрасно работает для Unix, но Windows, кажется, интерпретирует char 0x1A как ошибка конца файла (EOF) и прекратить чтение данных. Почему Windows делает это, а не Unix? И как я мог его выключить?

Я даже попробовал обработку ошибок, посмотрев на ifstream сам и проверьте, был ли установлен флаг EOL. Тогда я бы clear() ifstreamфлаги ошибок и продолжить чтение (используя get()) но эта чертова вещь всегда возвращает один и тот же EOF / 0x1A символ и не читается в следующем символе.

РЕДАКТИРОВАТЬ: Добавлен код


ifstream input (PATH, ios::in);
if (input.is_open()) {
unsigned int counter = 0;
while (input.good()) {
BYTE byte;
byte = input.get();
printf("%i, ", byte);
counter++;
}
printf("\r%i, ", counter);
input.close();
} else {
printf("Can't open file!");
}

Любая помощь очень ценится.

Максимум

0

Решение

С ifstream input (PATH, ios::in);Вы открываете файл в текстовом режиме (по умолчанию). Когда файл открывается в текстовом режиме, стандартная библиотека выполняет специфичные для платформы преобразования данных, считанных из файла, чтобы сопоставить собственный формат платформы для текстовых файлов с представлением текстового файла в C (и C ++).

Для Unix-подобных систем (включая Mac OSX и Linux) собственный текстовый формат такой же, как C и C ++ для просмотра текста, поэтому никаких преобразований не требуется.

На платформах Windows окончания строк должны быть преобразованы ('\n' преобразуется в и из последовательности символов CR LF) и символ EOF, который определяет Windows (1A) должен быть истолкован.

В других системах могут потребоваться более обширные преобразования (например, если текстовый файл указан в виде строк с пробелами ровно 80 символов, реализация должна будет сгенерировать '\n' сам символ после прочтения 80 символов, и он может подавить символы пробела в конце).

4

Другие решения

с ios :: двоичный флаг:

#include <iostream>
#include <fstream>
#include <windows.h>

int main()
{

std::ifstream input ("msg.txt",  std::ios::binary );
if (input.is_open())
{
unsigned int counter = 0;
while (input.good())
{
BYTE byte;
byte = input.get();
printf("%d : %d \n", counter,  byte);
counter++;
}

input.close();
}
}

Входные данные : 0x43 0x66 0x1A 0x79 0x68 0xAc

выход :

0 : 48
1 : 120
2 : 52
3 : 51
4 : 32
5 : 48
6 : 120
7 : 54
8 : 54
9 : 32
10 : 48
11 : 120
12 : 49
13 : 65
14 : 32
15 : 48
16 : 120
17 : 55
18 : 57
19 : 32
20 : 48
21 : 120
22 : 54
23 : 56
24 : 32
25 : 48
26 : 120
27 : 65
28 : 99
29 : 32
30 : 255

В этом примере данные читаются как символ за символом, но вы можете адаптировать его к своему варианту использования, используя ifstream.read(buffer, buffersize) ,

Кстати, эта программа была скомпилирована с GCC на Windows7

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector