Предполагая, что вы хотите, первые 1000 байт, а последние 1000 байт файла, и в значительной степени игнорируя проблемы с файлами меньшего размера, чем 2000 байт (это работает, но вы можете захотеть другой результат), вы можете использовать :
#include <stdio.h>
enum { NUM_BYTES = 1000 };
int main(int argc, char **argv)
{
for (int x = 1; x < argc; x++)
{
FILE *fp = fopen(argv[x], "r");
if (fp)
{
char buffer[NUM_BYTES];
int nbytes = fread(buffer, 1, NUM_BYTES, fp);
fwrite(buffer, 1, nbytes, stdout);
if (fseek(fp, -NUM_BYTES, SEEK_END) == 0)
{
nbytes = fread(buffer, 1, NUM_BYTES, fp);
fwrite(buffer, 1, nbytes, stdout);
}
fclose(fp);
}
else
{
fprintf(stderr, "%s: could not open file %s\n", argv[0], argv[x]);
}
}
}
Это использует fread()
, fwrite()
и fseek()
как предложено в комментариях.
Он также заботится о том, чтобы закрыть успешно открытые файлы. Он не требует разрешений на запись для файлов, поскольку он только читает и не записывает эти файлы (используя "r"
вместо "r+"
в вызове fopen()
).
Если файл меньше 1000 байт, то fseek()
не будет работать, потому что он пытается найти отрицательное смещение. Если это произойдет, не беспокойтесь читать или писать еще 1000 байт.
Я обсуждал, следует ли использовать sizeof(buffer)
или NUM_BYTES
в вызовах функций. Я решил, что NUM_BYTES
был лучше, но выбор не является окончательным - вместо этого есть аргументы для использования sizeof(buffer)
.
Обратите внимание, что buffer
становится локальной переменной. Нет необходимости его нулевать; только записи, записанные на fread()
, будут записаны fwrite()
, поэтому проблема не решена bzero()
. (В то же время, когда переменная была глобальной, переменные со статической продолжительностью по умолчанию были инициализированы по умолчанию для всех байтов.)
Сообщение об ошибке записывается в стандартную ошибку.
Код не проверяет чтение нулевых байтов; возможно, должно.
Если NUM_BYTES
становится параметром (например, вы называете программами fl19
и использовать fl19 -n 200 file1
для печати первый и последние 200 байт file1
), то вам необходимо сделать некоторую уборку, а также обработки аргументов командной строки.
* Я предполагаю, что это связано с просто добавлением '-' перед количеством байтов N * Это ** восхитительно ** (но неверно). [Как определить размер файла в C?] (Http://stackoverflow.com/questions/8236/how-do-you-determine-the-size-of-a-file-in-c) –
Вероятно, вам понадобится подходящая комбинация ['fread()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fread.html), ['fwrite()'] (http: // pubs .opengroup.org/onlinepubs/9699919799/functions/fwrite.html) и ['fseek()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html) –
Я пробовал использовать fread и fwrite, но он не будет компилироваться.Я не понимаю, что я делаю неправильно, но я думаю, что есть проблема с использованием буфера и файла в качестве аргументов в fread и fwrite.while (fread (buffer, 1, number, file)) { fwrite (buffer, 1, номер, файл); printf ("% s", буфер); } – advan