Segmentation fault при попытке чтения файла (которого нет) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Новичок в С. Сижу под линухом. Что-бы освоить аргументы командной строки и i/o файлов в С решил написать программу.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
#include <string.h>
 
int main(int argc, char *argv[]){
    FILE *fp;
   
    if(strcmp(argv[1],"-r")==0){
        fp = fopen(argv[2],"r");
        if(strcmp(fp,"NULL")){
            fprintf(stderr, "Can't open input file %s!\n", argv[2]);
            exit(ENOENT);
        }
        char buff[50];
        while(!feof(fp)){
            fgets(buff, 50, fp);
            printf("%s\n", buff);
        }
        fclose(fp);
        exit(0);
    }
    if(strcmp(argv[1],"-w")==0){
        fp = fopen(argv[2], "w");
        if(strcmp(fp,"NULL")){
            fprintf(stderr, "Can't open output file %s!\n", argv[2]);
            exit(ENOENT);
        }
        fprintf(fp, argv[3]);
        fclose(fp);
        exit(0);
    }
    printf("Use "-r \'inputfile\'" to read file.\n");
    printf("Use "-w \'outputfile\' \'inputtext\'" to write into file.\n");
    exit(EINVAL);
    return 0;
}
Как итог программа собирается, но при запуске любыми аргументами (и без них) выдаёт

Segmentation fault

(Exit code 139).

Решение задачи: «Segmentation fault при попытке чтения файла (которого нет)»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
#include <string.h>
 
int main(int argc, char *argv[]){
    FILE *fp;
    
    if(strcmp(argv[1],"-r")==0 ){
        fp = fopen(argv[2],"r");
        if(!fp){
            fprintf(stderr, "Can't open input file %s!\n", argv[2]);
            exit(ENOENT);
        }
        char buff[50];
        while(!feof(fp)){
            fgets(buff, 50, fp);
            printf("%s\n", buff);
        }
        fclose(fp);
        exit(0);
    }
    if(strcmp(argv[1],"-w")==0){
        fp = fopen(argv[2], "w");
        if(!fp){
            fprintf(stderr, "Can't open output file %s!\n", argv[2]);
            exit(ENOENT);
        }
        fprintf(fp, "%s", argv[3]);
        fclose(fp);
        exit(0);
    }
    printf("Use -r \'inputfile\' to read file.\n");
    printf("Use -w \'outputfile\' \'inputtext\' to write into file.\n");
    exit(EINVAL);
    return 0;
}

Объяснение кода листинга программы

  1. Объединение стандартных библиотек
  2. Объявление main функции
  3. Проверка аргументов командной строки
  4. Открытие файла для чтения или записи
  5. Проверка успешного открытия файла
  6. Чтение файла построчно и вывод на экран
  7. Закрытие файла после чтения или записи
  8. Выход из программы с кодом ошибки
  9. Вывод сообщения об использовании флага -r
  10. Вывод сообщения об использовании флага -w
  11. Вывод сообщения об ошибке при неправильном использовании флага -w
  12. Выход из программы с кодом ошибки
  13. Объявление переменной fp для работы с файлами
  14. Объявление массива buff для чтения текста из файла
  15. Проверка конца файла перед чтением
  16. Вывод прочитанной строки из файла
  17. Закрытие файла после чтения или записи
  18. Выход из программы с кодом ошибки
  19. Объявление флага EINVAL для обработки ошибок
  20. Выход из программы с кодом ошибки

Оцени полезность:

13   голосов , оценка 3.385 из 5
Похожие ответы