2012-05-21 3 views
1

Как видно из названия, freads, по-видимому, читает только первые 64 символа. Соответствующий код:fread только чтение 64 байта?

FILE* sigD = fopen("signature", "r"); 
char *sig[255]; 
fread(sig, 255, 255, sigD); 
close(sigD);  
fputs(sig, stdout); 

Консоль вывода:

[email protected]:~$ ./a.out --has-sig 
;2F*S|tr;;E9;Yb=R6)[email protected]`#NzLy<}[email protected]+uvH${3Et&9K&-0~%D{1 
[email protected]:~$ 
[email protected]:~$ cat signature 
;2F*S|tr;;E9;Yb=R6)[email protected]`#NzLy<}[email protected]+uvH${3Et&9K&-0~%D{1N{7ry:-B9b:kGB=Gkk9V+Cc$8a&35W{15Q~#-+PMeqa;#[email protected]>R!V#[email protected](Xj<a,^B)qJ5D&bON//?%/!G)XA&m|8:1mVHmx{7nQoRJ%v{(K:;JtX2hOm/dhVm9mnuDMSbQX55ouVnmECbA`/`!?=Mh0Ab^@vk*K*HG5$omu6716/Loh1Ht 

ч Как что журнал показывает, есть 254 символов в файле, но только 64 становятся читать.

РЕДАКТИРОВАТЬ: проблема была не с fread, я случайно записал нулевые терминаторы в файл.

+0

Я полагаю, что вместо этого вы должны иметь fread (sig, sizeof (char), 255, sigD). –

+0

Почему вы не потрудились проверить возвращаемое значение из 'fread'? – Neil

ответ

3

Это не ясно, если это связано, но там, кажется, пару проблем:

char *sig[255]; 
fread(sig, 255, 255, sigD); 

Вызов fread не согласуется с декларацией. Возможно, это должно быть следующее (вы, вероятно, хотите, чтобы массив char, а не массив указателей на char). И информация размер/nitems передается fread не было правильно:

char sig[255]; 
// initially I had this as 'sizeof(), 1' but I think for this file it would make 
// more sense as the following (nitems=255): 
fread(sig, 1, sizeof(sig), sigD); 

И хотя это не имеет значения, вы можете попробовать открыть его с режимом "rb", чтобы заставить бинарный открытой (когда b двоичный предполагается игнорируются на совместимых с POSIX системах).

+0

Сделано все эти изменения, все 254 символа не печатаются. – W00t

+0

@ W00t: После некоторого раздумья я отменил порядок аргументов fread (параметры размера и nitems). Вы можете попробовать это, но я подозреваю, что это не изменит ситуацию. И, возможно, добавьте 'b' в режим ... но это также * должно * не повлиять на него. Извините - здесь расплывчато. –

+0

Изменение r на rb не повлияло. Другие идеи? – W00t

3

Неверное определение sig. Если вам нужен массив символов, вы должны удалить звездочку. Вы определили массив указателей символов. Он должен выглядеть так:

char sig[255]; 
Смежные вопросы