2016-02-14 9 views
1

Я новичок в программировании в целом. Обратите внимание, что это для домашней работы. Я использую txt-файл с a-z в нижнем регистре. Я использую команду ./a.out test.txt для запуска программы, а затем введите число.C Программа для печати первой и последней n строк в файле, что я делаю неправильно?

мой код:

#include <stdio.h> 

static void cat(FILE *fp, int num) { 
    int count = 0; 
    char buffer[4096]; 

    while (fgets(buffer, sizeof(buffer), fp) != 0) { 
     if (count == num) 
      break; 
     else 
      count++; 
     fputs(buffer, stdout); 
    } 
} 

int main(int argc, char *argv[]) { 
    int num, count = 0; 
    long length; 
    char buffer[4096]; 

    FILE *fp; 
    fp = fopen(argv[1], "r"); 
    if (fp == NULL) { 
     printf("Can't open this file\n"); 
     return 0; 
    } 

    scanf("%d", &num); 
    cat(fp, num); 
    printf("...\n"); 

    fseek(fp, 0, SEEK_END); 
    length = ftell(fp); 
    fseek(fp, (length - 2), SEEK_SET); 
    printf("1\n"); 
    while (fgets(buffer, sizeof(buffer), fp) != 0) { 
     fputs(buffer, stdout); 
    } 
    if (ftell(fp) == '\n') { 
     count++; 
     length = ftell(fp); 
     fseek(fp, (length - 4), SEEK_SET); 
     printf("2\n"); 
     while (fgets(buffer, sizeof(buffer), fp) != 0) { 
      fputs(buffer, stdout); 
     } 
    } else { //<------ missing opening brace 
     length = ftell(fp); 
     fseek(fp, (length - 2), SEEK_SET); 
     printf("3\n"); 
     while (fgets(buffer,s izeof(buffer), fp) != 0) { 
      fputs(buffer, stdout); 
     } 
     if (count == num) { 
      printf("4\n"); 
      while (fgets(buffer, sizeof(buffer), fp) != 0) { 
       fputs(buffer, stdout); 
     } 
    } 

    fclose(fp); 
    return 0; 
} 

Пожалуйста, помогите!

+0

Пожалуйста, добавьте белое пространство между операторами код трудно читать, и что это 'ftell (FP) == '\ n''? зачем ты это делаешь? –

+0

Вы опубликовали код, который не компилировался? –

ответ

1

Я переформатировал ваш код, чтобы улучшить читаемость. Отсутствует {, где я указал. Как указано, код не компилируется.

Ваша программа должна иметь возможность распечатывать первые строки n, но ваш метод не может работать для последних строк n.

Выделяют массив n буферов:

char (*array)[4096] = calloc(4096, num); 

Для каждой строки читать, перемещать буферы и скопировать строку в последней позиции:

memmove(array[0], array[1], sizeof(array[0] * (num - 1)); 
strcpy(array[num - 1], buffer); 

Есть более эффективные методы, но вы должны быть в состоянии реализовать этот простой метод.

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

EDIT:

Вот полная версия, которая использует массив num+1 буферов. Он читает весь файл, печатая первые строки num по мере их чтения и сохраняя последние строки num в массиве во все времена, циклируя позицию, в которой он считывает следующую строку над буферами num+1.

В конце файла, если файл имеет более чем num строк, должны быть напечатаны дополнительные строки, потенциально разделенные --------, если строки пропущены в середине файла. Распечатываются последние строки num: pos вычисляется для поиска нужного буфера по модулю num+1, и строки печатаются до последнего.

Вот код:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    int num, pos, count; 
    FILE *fp; 
    char (*array)[4096]; /* pointer to an array of buffers */ 

    if (argc < 2) { 
     printf("Usage headtail filename [number]\n"); 
     return 1; 
    } 
    fp = fopen(argv[1], "r"); 
    if (fp == NULL) { 
     printf("Cannot open file %s\n", argv[1]); 
     return 1; 
    } 
    if (argc > 2) { 
     /* get the number from the command line if 2 args were given */ 
     if (sscanf(argv[2], "%d", &num) != 1) { 
      num = -1; 
     } 
    } else { 
     /* otherwise read from standard input */ 
     if (scanf("%d", &num) != 1) { 
      num = -1; 
     } 
    } 
    if (num < 0) { 
     printf("Invalid number\n"); /* negative or non numeric */ 
     return 1; 
    } 

    /* allocate space for num+1 buffers */ 
    array = malloc(4096 * (num + 1)); 

    for (count = pos = 0; fgets(array[pos], 4096, fp) != NULL; count++) { 
     /* printing the first num lines */ 
     if (count < num) 
      fputs(array[pos], stdout); 
     /* cycle buffers for num lines + 1 extra buffer */ 
     if (++pos >= num + 1) 
      pos = 0; 
    } 
    if (count > num) { 
     /* more lines to print */ 
     pos = count - num; 
     if (pos > num) { 
      /* print place holder for missing lines */ 
      printf("...\n"); 
     } else { 
      /* print from the last line printed */ 
      pos = num; 
     } 
     for (; pos < count; pos++) { 
      fputs(array[pos % (num + 1)], stdout); 
     } 
    } 
    fclose(fp); 
    return 0; 
} 
+0

Что значит? Как я уже говорил выше, я мало что знаю о программировании, так что вы могли бы объяснить немного больше? –

+0

Спасибо за ответ! Теперь мне просто нужно это понять ...: P –

+0

@ N.Cvt .: Я обновил ответ с помощью более простого и более эффективного метода, который использует меньше памяти.Изучайте это, это должно быть легче понять. – chqrlie

0

1) Вы должны проверить, меньше ли размер файла, чем размер буфера.

2) Если вы собираетесь читать файл для n строк в кусках данных за раз, прочитайте его по одной строке за раз. вероятно, используя fscanf. Таким образом, вы можете отслеживать, сколько строк вы прочитали/распечатали. Также это помогает узнать, имеет ли ваш файл достаточно строк.