2016-05-12 5 views
0

Моя программа компилируется, но когда я запускаю его ./program -n 3 1000.txt, я получаюОшибка сегментации 11?

ошибки сегментации: 11.

Что это значит?

Что делает моя программа: напечатайте первые 10 строк файла. Если файл имеет менее 10 строк, весь файл должен быть напечатан. Программа не должна создавать файлы. Он просто печатает часть содержимого файла на стандартный вывод.

Также должно быть указано, что печатается другое количество строк. Это будет указано путем передачи строки -n в качестве первого аргумента программы, количества строк, которые будут напечатаны как второй аргумент, и файла в качестве третьего аргумента.

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

int main(int argc, char * argv[]){ 

int i, n; 
char line[1024]; 
n = atoi(argv[2]); 

if(argc == 2){ //eg ./program 1000.txt 
    FILE * fPointer; 
    fPointer = fopen("1000.txt", "r"); 
    for(i = 1; i <= 10; i++){ 
     fgets(line, 1024, fPointer); 
     fprintf(fPointer, "%s\n", line); 
    } 
    fclose(fPointer); 
} else if(argc == 4){ //eg ./program -n 4 1000.txt 
    FILE * fPointer; 
    fPointer = fopen("1000.txt", "r"); 
    for(i = 1; i <= n; i++){ 
     fgets(line, 1024, fPointer); 
     fprintf(fPointer, "%s\n", line); 
    } 
    fclose(fPointer); 
} else { 
    printf("Wrong number of inputs.\n"); 
} 

return 0; 

} 
+0

Ваша программа сделала что-то ОС не нравится. Вы уверены, что читаемый '1000.txt' существует в правильном пути? Добавление проверки, если 'fopen()' было успешным, хорошо. – MikeCAT

+0

Это означает, что вы получаете доступ к памяти, которой не должно быть. Возможно, нулевой указатель? Используйте отладчик, чтобы узнать. PS: Проверьте страницу руководства для 'fopen', но не может возвращать' null' в случае, если файл не может быть открыт. –

+0

Используйте отладчик, чтобы помочь вам найти проблему. И вы действительно должны добавить проверку ошибок в свой код. Это сделает ваш код более надежным, а также поможет вам отладить любые проблемы. – kaylum

ответ

3
fprintf(fPointer, "%s\n", line) 

Это проблема. Вы получаете строку в fgets в свой массив и вместо того, чтобы печатать ее на стандартный вывод, вы пытаетесь распечатать файл, который вы открыли только для чтения. Вам просто нужно использовать обычный printf для этой работы.

EDIT

Оказалось, что это не причина, почему это segfaults, но она по-прежнему является проблемой, если вы хотите, чтобы ваша программа делать то, что вы хотите.

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

+1

Вы уверены? Я недостаточно читал спецификацию, чтобы определить, что это вызывает * неопределенное поведение * или нет, но программа не выбрала ошибку сегментации в [моем эксперименте] (http://melpon.org/wandbox/permlink/ezRV6leU8z64EPCZ). – MikeCAT

+0

@MikeCAT Да, вы правы. Я думал, что это проблема. Однако он работал на моем компьютере, но ничего не писал. Интересно, я отредактирую свой ответ, когда найду что-то актуальное. –

+0

Я не могу получить это в segfault, не используя неправильное количество аргументов, и это только segfaults в 'n = atoi (argv [2]);'. Извините за отправку ответа без чека. –

4

В этом примере будут напечатаны 3 строки файла для аргументов $ ./a.out -n 3 data.txt. Я переместил atoint в состояние, и я изменил печать на printf.

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

int main(int argc, char *argv[]) { 
    int i, n; 
    char line[1024]; 
    FILE *fPointer; 
    if (argc == 2) { //eg ./program 1000.txt 
     FILE *fPointer; 
     fPointer = fopen("data.txt", "r"); 
     for (i = 1; i <= 10; i++) { 
      fgets(line, 1024, fPointer); 
      printf("%s\n", line); 
     } 
     fclose(fPointer); 
    } else if (argc == 4) { //eg ./program -n 4 1000.txt 
     n = atoi(argv[2]); 
     FILE *fPointer; 
     fPointer = fopen("data.txt", "r"); 
     for (i = 1; i <= n; i++) { 
      fgets(line, 1024, fPointer); 
      printf("%s\n", line); 
     } 
     fclose(fPointer); 
    } else { 
     printf("Wrong number of inputs.\n"); 
    } 
    return 0; 
} 

Файл data.txt

Superman 
Batman 
Cyclops 
Thor 
Wolverine 
Superman 
Batman 
Cyclops 
Thor 
Wolverine 
Superman 
Batman 
Cyclops 
Thor 
Wolverine 
Superman 
Batman 
Cyclops 
Thor 
Wolverine 

Выход

$ ./a.out -n 3 data.txt 
Superman 

Batman 

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