Двоичные файлы в C ++ - PullRequest
       13

Двоичные файлы в C ++

1 голос
/ 24 марта 2012

Я хочу сохранить данные от нужного байта до другого желаемого байта файла, открытого в двоичном режиме, в другой файл.Допустим, указатель файла находится на байте № 10, теперь я хочу прочитать данные из байта № 11 в байт № 30. Я знаю, что должен использовать функцию fread (), но не знаю, как сказать этой функции читать из нужного местадо другого желаемого места.Я новичок, так что не стесняйтесь отвечать на этот вопрос.

Я знаю, что fread () - это функция C, я хочу, чтобы C ++ эквивалентные функции выполняли эту работу.Ссылка или предложение книги для обучения работе с файлами будет отличным!

Большое спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

Вы должны искать:

std::ifstream infile("source.bin", std::ios::binary);

infile.seekg(10, std::ios::beg);  // seek to 10 bytes from the beginning

char buf[20];

if (!infile.read(buf, 20)) { /* error */ }

// now your data is in buf

Интерфейс stdio аналогичен, но, поскольку это C ++, мы предпочитаем iostreams. Вы никогда не должны использовать операции ввода-вывода, не проверяя их возвращаемое значение, а в iostreams это довольно просто. С fread вы должны быть осторожны, чтобы правильно интерпретировать возвращаемое значение.

1 голос
/ 24 марта 2012

Ну, прототип для фреда:

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

И fseek это:

int fseek ( FILE * stream, long int offset, int origin );

Если вы хотите получить байт # 11, вы можете сделать:

fseek(file, 11, SEEK_SET) // this means: go 11 bytes from the start position.

или, поскольку у вас уже есть байт 10, вы можете сделать:

fseek(file, 1, SEEK_CUR)  // this means: go 1 byte beyond current position.

Затем, чтобы прочитать до байта 30 из байта 11, вам нужно прочитать 19 байтов (30–11), поэтому вы делаете:

fread(buffer, sizeof(char), 19, file).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...