2017-02-01 1 views
1

Я пытаюсь исправить приведенный ниже код, чтобы читать только первые N байтов. Я также хотел бы сделать то же самое, но для последнего числа N байтов (я предполагаю, что это связано только с добавлением «-» перед количеством байтов N). Я не уверен, что использование fget - правильный метод для этого.C в UNIX: чтение/объединение файлов на основе количества байтов

Я попытался изменить 1000 в

while(fgets(buffer, 1000, fp) 

однако я не думаю, что изменить это значение будет забрать определенное количество байтов, как я прочитал, что это только максимальное значение.

char buffer[1001]; 

int main(int argc, char** argv) { 
    bzero(buffer, sizeof(buffer)); 
    for(int x=1; x<argc; x++) { 
    FILE *fp = fopen(argv[x], "r+"); 
    if (fp) { 
     while(fgets(buffer, 1000, fp)) { 
     printf("%s", buffer); 
     } 
    } else { 
     printf("could not open file %s\n", argv[x]); 
    } 
    } 
} 
+3

* Я предполагаю, что это связано с просто добавлением '-' перед количеством байтов N * Это ** восхитительно ** (но неверно). [Как определить размер файла в C?] (Http://stackoverflow.com/questions/8236/how-do-you-determine-the-size-of-a-file-in-c) –

+2

Вероятно, вам понадобится подходящая комбинация ['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) –

+0

Я пробовал использовать fread и fwrite, но он не будет компилироваться.Я не понимаю, что я делаю неправильно, но я думаю, что есть проблема с использованием буфера и файла в качестве аргументов в fread и fwrite.while (fread (buffer, 1, number, file)) { fwrite (buffer, 1, номер, файл); printf ("% s", буфер); } – advan

ответ

0

Предполагая, что вы хотите, первые 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), то вам необходимо сделать некоторую уборку, а также обработки аргументов командной строки.

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

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