2015-12-01 4 views
-1

Если кто-то может помочь мне пройти мимо этого roadblock, который будет потрясающим. Я пытаюсь открыть текстовый файл под названием «inputfile.txt», и я не могу! Каждый пример, который я просмотрел, работал нормально, но когда я пытаюсь его использовать, файл возвращает null, и я получаю ошибку сегментации. Заметим, что это до проверки ошибокЧтение текстового файла из командной строки C

#include <stdio.h> 
int main(int argc, char *argv[]) 
{ 
    FILE *inputPtr; 
    inputPtr = fopen(argv[2], "r"); 
    fclose(inputPtr); 
} 

я понял, что «goofed» чуть-чуть, когда я первый создал текстовые файлы на моем рабочем столе я назвал его «inputfile.txt», но он был сохранен как " inputfile.txt.txt ", как это ни странно!

+1

Вы можете добавить строку перед 'fopen' линии и поделиться результатами? 'printf (« Args =% d, имя файла% s \ n », argc, argc> 2? argv [2]:« OOB »;« Также добавление «return 0;» на конец - хорошая идея. –

+0

@MohitJain lol У меня есть это позже в моем коде с проверкой ошибок. Вывод: Args = 4, File name inputfile.txt – John

+0

, а затем не удалось открыть и сегментировать ошибку (сбрасывать сердцевину) после этого – John

ответ

1

Ну, первая большая проблема заключается в том, что вы не проверяете значение argc. Это значение устанавливается на количество аргументов, переданных программе. По умолчанию argc не менее 1, потому что всегда передается 1 аргумент. Если вы передадите дополнительные аргументы, argc должен быть больше 1. В вашем случае, я думаю, это должно быть 2. Вторая проблема возникает из-за первой. Нумерация элементов массива в C начинается с 0, поэтому, если ваша программа принимает аргументы argc, argv, которая хранит аргументы, будет содержать argc элементов, НО !!! последний элемент будет иметь индекс argc-1. По умолчанию, если никаких дополнительных аргументов не было, то существует только argv[0], и это имя программы, оно также всегда передается, поэтому argc всегда не менее 1.

В вашем случае, если argc==2, тогда argv [2 ] просто не существует, только argv[0], и argv[1] есть. И когда вы передаете один аргумент программе, он будет храниться в argv [1]. Это означает, что эту строку inputPtr = fopen(argv[2], "r"); следует изменить на это inputPtr = fopen(argv[1], "r");. Также должна быть проверка argc в начале программы. Soome вещь вдоль линий

int main(int argc, char *argv[]) 
{ 
    if(argc!=2) 
    { 
    printf("Wrong number of arguments\n"); 
    return -1; 
    } 
..... 
} 
+0

предполагается, что программа имеет argc = 4 с a.out, символом, входным файлом, выходным файлом в этом порядке , Я не понимаю, почему это не работает, потому что он работает повсюду, я видел это – John

+0

, и вы действительно должны его проверить, если на самом деле у этого есть четыре аргумента для стартеров, потому что, может быть, просто нет. –

+1

спасибо, это хорошее предложение, но я понял, что сделал ошибку, сохранив текстовый файл как «inputfile.txt.txt» lol спасибо за вашу помощь !! – John

0

до доступа ничего, кроме argv[0] (который всегда доступен)

код должен проверить значение argc для обеспечения параметров командной строки на самом деле существует.

Примечание; в C индексы массива начинаются с 0 по (количество записей массива -1).

Так что если argc является 2, то есть только один параметр командной строки и:

  1. argv[0] является исполняющим имя программы
  2. argv[1] является первым параметром.
  3. argv[2] NULL указатель.

поэтому использование argv[2] обращается к адресу 0 и приведет к

  1. непредсказуемого поведения
  2. приводит к событию неисправностей сегментного
Смежные вопросы