2015-11-17 7 views
-2

Я работаю на C и пытаюсь прочитать образ файловой системы (например: name.IMA), и мне это нужно в двоичной форме, потому что мне нужно прочитать его байтом по байту. Каков правильный способ чтения этих файлов в C? Ниже не работает:Как fopen() файл .IMA?

FILE *filePointer = fopen("name.IMA","rb"); 
fread(buffer, fileLength, 1, filePointer); 

ГЛАВНАЯ ПРОБЛЕМА: Fread() на самом деле открытия и чтения, как и ожидалось. Путаница из-за возвращаемого значения, заданного параметром fread(), почему-то равна 1 (даже если было прочитано более 1 байта). В чем проблема?

+0

Что такое 'fileLength' для инициализации? Как вы выбрали эту ценность? Вы проверили значение, возвращаемое 'fopen()'? Тот, который возвращает 'fread()'? –

ответ

2

Если ваша линия fread не делает то, что вы ожидали, я бы посмотрел на то, что установлено для fileLength. Если это больше байтов, чем можно прочитать, то fread будет возвращать ноль.

Одна вещь, которую вы должны иметь в виду, что fread() возвращает количество элементов чтения, а не количество байт (подчеркнуто мною):

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

В случае успеха, fread() вернуть номер штук прочитайте. Это число равно числу байтов, переданных только, когда размер 1.

Так есть разница между этими двумя:

size_t n = fread (buffer, s, 1, fp); 
size_t n = fread (buffer, 1, s, fp); 

Первое чтение до один элемент от размера s, так что только когда-либо будет возвращено ноль или один. Второй считывает до s элементов одного размера, поэтому может возвращать значение 0..s включительно.

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

char buff[128]; 
size_t sz; 
FILE *fp = fopen ("name.ima", "rb"); 
if (fp != NULL) { 
    while ((sz = fread (buff, 1, sizeof (buff), fp)) > 0) 
     doSomethingWith (buffer, sz); 
    fclose (fp); 
} 
+0

Хорошо, так вот ситуация. Fread() фактически открывается и читается, как ожидалось. Путаница происходит из-за возвращаемого значения, заданного параметром fread(), по какой-то причине 1 (хотя было прочитано более 1 байт). В чем проблема? – Vimzy

+1

@Vimzy, вы указали, что хотите прочитать * один * элемент размера 'fileLength'. 'fread()' возвращает число * элементов * read, а не количество байтов.Если вы замените аргументы таким образом: «fread (buffer, 1, fileLength, filePointer)», вы просите прочитать элементы 'fileLength' размера 1, и вы получите количество прочитанных байтов. – paxdiablo

+0

Последнее уточнение, добавляет ли fread() нулевой ограничитель в конце буфера? Буфер является указателем ints (с использованием malloc)? – Vimzy

0

Ваш Fread возвращает 1, потому что просят прочитать только один элемент

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

в вашем случае, вы устанавливаете счетчик будет 1. Вот почему его чтение только один элемент т.е. один байт

Кроме того, вы устанавливаете размер как fileLength, что неверно. size - размер каждого элемента.

+0

Только один nitpick: элемент является байтом, когда размер 1, который, как вы заявляете в следующем тексте, не тот. В противном случае это будет несколько байтов. Фактически два nitpicks, поскольку вполне приемлемо иметь элемент того же размера, что и файл, если вы хотите просто атомарно загрузить весь файл. Есть случаи, когда вы должны загружать элементы по отдельности, но я не думаю, что это один из них. – paxdiablo

 Смежные вопросы

  • Нет связанных вопросов^_^