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;
}
Объяснение кода листинга программы
- Объединение стандартных библиотек
- Объявление main функции
- Проверка аргументов командной строки
- Открытие файла для чтения или записи
- Проверка успешного открытия файла
- Чтение файла построчно и вывод на экран
- Закрытие файла после чтения или записи
- Выход из программы с кодом ошибки
- Вывод сообщения об использовании флага -r
- Вывод сообщения об использовании флага -w
- Вывод сообщения об ошибке при неправильном использовании флага -w
- Выход из программы с кодом ошибки
- Объявление переменной fp для работы с файлами
- Объявление массива buff для чтения текста из файла
- Проверка конца файла перед чтением
- Вывод прочитанной строки из файла
- Закрытие файла после чтения или записи
- Выход из программы с кодом ошибки
- Объявление флага EINVAL для обработки ошибок
- Выход из программы с кодом ошибки