2013-07-12 3 views
1

Я пытаюсь узнать, как использовать fread и fwrite. Здесь я пытаюсь напечатать содержимое файла на стандартном выходе.Использование fread и fwrite

#include <stdio.h> 

int main() 

{ 
FILE *fp; 
fp = fopen("largest.c", "r+"); 
int c = fwrite(fp, sizeof(fp), 1, stdout); 

printf("Output is 1 if write succesful! : %d\n", c); 

return 0; 
} 

Это не работает. Показывает некоторые искажения на экране. Зачем?

+1

это должно быть 'c = fwrite (fp, sizeof (int), 1, stdout);', 1, если вы хотите написать один int. Вы хотите читать или писать **? ** –

+0

Ознакомьтесь с http://www.cplusplus.com/reference/cstdio/fread/ для чтения примера –

ответ

6

Потому что вы никогда не чтение из файла, который вы открыли.

Вместо этого вы выгружаете определение структуры данных FILE (что-то, что является внутренним для реализации стандартной библиотеки) до stdout, производя искаженный вывод.

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

FILE *fp; 
char buffer[4096]; 

/* ... */ 
const size_t got = fread(buffer, 1, sizeof buffer, fp); 
fwrite(buffer, 1, got, stdout); 

выше добавляет buffer символов, и делает один fread() звоните, чтобы попытаться заполнить этот буфер данными из файла fp (я не повторил звонок fopen(), который все равно должен произойти, конечно).

Затем он вызывает fwrite(), передавая ему буфер, содержащий данные, считанные из файла.

Обратите внимание, что это будет читать (и, таким образом, писать) максимум до 4096 символов; если входной файл больше, вы не увидите оставшиеся данные. Это может быть исправлено, выполнив выше в цикле, останавливаясь, когда fread() возвращает 0.

Кстати, ваше использование напоминает мне о Linux-специфической sendfile() функции, где вы действительно получите, чтобы пропустить делать чтение на уровень приложения. Вместо этого это делается внутри ядра, которое предположительно открывает его для оптимизации. Это, вероятно, немного выше вашего текущего уровня.

+0

Получил! Большое спасибо. – Ajit

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