Потому что вы никогда не чтение из файла, который вы открыли.
Вместо этого вы выгружаете определение структуры данных 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()
функции, где вы действительно получите, чтобы пропустить делать чтение на уровень приложения. Вместо этого это делается внутри ядра, которое предположительно открывает его для оптимизации. Это, вероятно, немного выше вашего текущего уровня.
это должно быть 'c = fwrite (fp, sizeof (int), 1, stdout);', 1, если вы хотите написать один int. Вы хотите читать или писать **? ** –
Ознакомьтесь с http://www.cplusplus.com/reference/cstdio/fread/ для чтения примера –