2016-03-29 4 views
0

Я пытаюсь получить имена входных и выходных файлов с помощью аргументов командной строки. Я просто использую getopt (скажите мне, если есть лучший способ), и я получил segmentation faultОшибка сегментации при использовании аргументов командной строки

Я уверен, что ошибка сегментации вызвана именем входного файла. Что-то не так, когда я беру имя входного файла из командной строки.

Вот мой код:

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

    char const *inFile = NULL; //I think the error is here 
           //an inFile that doesn't exist 
           //would cause a segmentation fault 
    char const *outFile = "outfile.txt"; 
    double val; 
    int xFlg= 0; 
    int c; 
    char *rm; //I need this for strtod, but I can use atoi instead 

    while ((c = getopt (argc, argv, "xo")) != -1) { 
     switch (c) { 
      case 'x': 
       val = strtod(optarg, &rm); 
       xFlg = 1; 
       break; 
      case 'o': 
       outFile = optarg; 
       break; 
      default: 
       help(); //void function that prints help 
       return EXIT_FAILURE; 
     } 
     rm=NULL; 
    } 
    inFile = *(argv + optind); 

    fread code 
    . 
    . 
    . 
    call function 
    . 
    . 
    . 
    fwrite code 
} 

Я уверен, что нет никаких проблем с моей freads и fwrites, потому что если я беру имя входной_файла и Outfile с помощью зсапа, все работает отлично, и я не получить ошибку сегментации.

Я использую значение xflg, чтобы решить, следует ли выполнять мою функцию или нет. val - это значение, которое выполняет моя функция.

Вот моя функция:

void xFunc (input1, input2, val, xFlg) { 
    if (xFlg == 1) { 
     function code 
     . 
     . 
     . 
    } else { 
    return; //don't run the function if the user doesn't type -x 
      //into command line. 
      //I don't know if this is the proper way to do this. 
    } 
} 

Это то, что я хочу добиться:

./run -х 3,14 -o outputfilename.txt inputfilename.txt

Edit:

Если для получения имени входного файла я делаю следующее, ошибка сегментации не возникает:

char inFile[100]; 
printf("Name of input file: \n"); 
scanf("%99s",somestring); 
+1

Где именно это крах? –

+0

Он компилируется без ошибок и сбой при открытии inFile. Я попытался использовать имя inFile, используя scanf, и он работает. – user6005857

+1

Измените свой вопрос и добавьте код, в котором произошел сбой. –

ответ

2

проблема два раза:

char const *inFile = NULL; 
...... 
inFile = *(argv + optind); 

После того, как вы инициировали const char* вы не можете назначить ей другое значение. Таким образом, чтобы исправить это, вы можете попробовать одно из следующих действий:

..... 
char const * inFile = *(argv + optind); 
..... 

Если вам не нужен указатель входной_файл до точки, где вы инициализировать его, это должно быть хорошо.

ИЛИ

char inFile[20]; //whatever size you need 
...... 
strcpy(inFile, *(argv + optind)); 

Таким образом, вы можете изменить указатель на файл, если вам нужно

+0

Это избавило от проблемы с ошибкой сегментации. Теперь я могу прочитать inFile, и я подтвердил это, распечатав некоторые значения изнутри inFile. Но моя функция xFunc не работает. – user6005857

+0

не может сказать много об этом ... Я не вижу, чтобы его вызывали где-нибудь в коде (конечно ... вы говорите что-то об этом в комментариях, но это не будет делать), и я не вижу функцию прототип или что-то еще ... в любом случае считайте, что это не код функции, а значение аргументов, которые вы предоставляете, которые не то, что вы ожидаете ... – Pandrei

+0

@Pandrei: 'char const * inFile' является то же, что и 'const char * inFile'. Он объявляет 'inFile' как указатель на постоянный символ, а не постоянный указатель на char. Вы можете назначить переменную 'inFile' после объявления ее, но вы не можете назначить' * inFile' или 'inFile [index]'. –

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