Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 1
Регистрация: 11.11.2016
Сообщений: 20
1

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

15.03.2017, 01:33. Показов 3347. Ответов 7

Author24 — интернет-сервис помощи студентам
Новичок в С. Сижу под линухом. Что-бы освоить аргументы командной строки и i/o файлов в С решил написать программу.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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).
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2017, 01:33
Ответы с готовыми решениями:

При попытке использовать одновременно параметры-nostartfiles и-static программа выдаёт Segmentation fault
#define MESG &quot;Hello, World!\n&quot; #define MESG_SZ sizeof(MESG) main() { write(1,MESG,MESG_SZ);...

[C/C++] "Segmentation fault" при попытке передачи параметра командной строки.
Прога вылетает при попытке передачи параметра через командную строку.Такой код: #include...

Segmentation fault при открытии файла
Ошибка в строке 450, процедура dopolniti вызывается в строке 527. Файл правильно закрыт и не...

Ошибка выполнения Segmentation fault при открытии файла
Привет всем! почему не открывается файл, не понимаю что такое? ubuntu 16, qt creator 3.6.1...

7
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
15.03.2017, 02:51 2
Цитата Сообщение от Quipex Посмотреть сообщение
C
1
strcmp(fp,"NULL")
C
1
if (fp == NULL)
0
0 / 0 / 1
Регистрация: 11.11.2016
Сообщений: 20
15.03.2017, 09:24  [ТС] 3
Цитата Сообщение от shvyrevvg Посмотреть сообщение
C
1
if (fp == NULL)
Проблему это не решило. Путём редактирования кода обнаружил, что ошибка возникает когда я передаю в название файла не константу, а аргумент командной строки
C
1
fp = fopen(argv[2], "w")
Если же имя файла "test", либо любая другая строковая константа, ошибки не возникает. Но что делать если я хочу передать именно аргумент командной строки?
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
15.03.2017, 09:37 4
Quipex, argc чему равен?
0
0 / 0 / 1
Регистрация: 11.11.2016
Сообщений: 20
15.03.2017, 10:03  [ТС] 5
shvyrevvg, имя программы + кол-во аргументов. Не выводится на экран, если не закомментить строку с открытием файла.
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
15.03.2017, 10:08 6
Цитата Сообщение от Quipex Посмотреть сообщение
имя программы + кол-во аргументов
Quipex, и чему он у Вас равен(printf("argc: %d\n", argc)?
0
0 / 0 / 1
Регистрация: 11.11.2016
Сообщений: 20
15.03.2017, 10:17  [ТС] 7
Цитата Сообщение от shvyrevvg Посмотреть сообщение
Quipex, и чему он у Вас равен(printf("argc: %d\n", argc)?
Если закомментить открытие файла, то ровно тому, что я и говорил.
К примеру ./app a b c => 4; ./app => 1
Не раскомменчивать => Та же ошибка, без какого-либо вывода
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
15.03.2017, 10:28 8
Лучший ответ Сообщение было отмечено Quipex как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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;
}
Проверки на argc сами добавите.
2
15.03.2017, 10:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2017, 10:28
Помогаю со студенческими работами здесь

segmentation fault в считывании из бинарного файла.
Подскажите, пожалуйста, как устранить такую проблемы: Заношу 3 элемента в список, сохраняю их в...

EndOfStreamException при попытке чтения файла
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Метаданные файла Segmentation Fault (core dumped)
Всем привет, совсем недавно начал изучать Linux и не пойму в чем дело....подскажите пожалуйста:...

Ошибка 103 при попытке чтения файла
Здравствуйте. После попытки чтения выдается ошибка runerror 103. Что нужно исправить? procedure...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru