2016-09-25 3 views
0

Я пытаюсь не жестко указывать имя входного файла в моей программе на C. У меня есть все остальные компоненты, которые работают, когда я hardcode имя файла. Но хотелось бы передать ему строковое имя файла. Я пытаюсь выполнить компиляцию файла с именем Matrix.c и назову его исполняемый файл matrix.Как передать имя файла при выполнении программы на языке C

Итак, в терминале, когда я добираюсь до своего рабочего каталога.

gcc -g Matrix.c -o matrix 

тогда, когда я компилирую

./matrix 

Он не имеет имя файла, переданное ему, так что я буду чек, что и пользователь ввел имя файла для загрузки.

Однако, когда кто-то передает имя файла, если он будет принят, как:

./matrix filename.txt 

или

./matrix < filename.txt 

С последним вариантом, я не могу показаться, чтобы получить имя аргумента передан функции от argv[1] - это просто «(Null)».

Я знаю, что это очень упрощенный вопрос. Но я просто полностью покинул свой рокер? Это как-то связано со мной на OS X El Capitan. Я знаю, что раньше я использовал соглашение «<».

+0

Я осмотрелся, и есть довольно много разных решений и разные способы справиться с этим. – WallofKron

+0

вы можете показать нам код 'matrix.c'? Перенаправление с помощью '<' не требует дополнительных аргументов, но чтение 'stdin' с помощью' scanf', 'gets', как бы вы не работали над стандартным вводом. –

+0

Когда вы используете <, вы перенаправляете ввод с вашего имени файла в свою программу. –

ответ

0

Аргументы команды находятся в argv [1 .. argc-1].

Переадресация с '<' отправляет содержимое файла на stdin программы.

Третий способ получить имя файла - напечатать «Enter filename:», а затем прочитать строку, введенную пользователем.

+0

Благодарим вас за это. Я просто исправил это и попытался обратиться ко всем трем режимам ввода. Спасибо – WallofKron

4

Проблема в том, как работает раковина, в основном. Когда вы используете:

./matrix filename.txt 

тогда программе даются два аргумента - имя программы и имя файла. При использовании:

./matrix < filename.txt 

тогда программа дается только один аргумент - имя программы - и оболочка организует его стандартный ввод прийти из файла (и имя файла не передается в программу).

Любой может быть изготовлен для работы; вам просто нужно решить, что вы хотите поддержать. Что произойдет, если пользователь наберет ./matrix file1.txt file2.txt file3.txt? Одной из версий обычного поведения будет обработка каждого файла по очереди, запись каждого набора результатов в стандартный вывод. Существует множество альтернативных форм поведения - большинство из них были использованы кем-то в то или иное время. Чтение со стандартного ввода, когда нет указанного имени файла, является общим режимом работы (подумайте cat и grep и ...).

+0

Благодарим вас за это. Я просто исправил это и попытался обратиться ко всем трем режимам ввода. Спасибо – WallofKron

+0

Я часто использую функции, похожие на 'int processor (FILE * fp, const char * fn)', который считывает входные данные из потока 'fp', который является открытым файлом' fn' (или псевдоним для стандартного ввода '), иногда используя дополнительный аргумент 'FILE * ofp', чтобы указать, к какому файлу должен быть записан вывод. Возвращаемое значение равно 0 для «успеха» и всего остального для отказа. Код в вашей основной программе может затем вызвать 'processor()' довольно легко. В самом деле, у меня есть набор функций, которые обрабатывают обработку для нулевого или более остаточных аргументов, поэтому 'main()' end' возвращает фильтр (argc, argv, optind, processor); '. –

+0

'isatty()' может быть полезен здесь, см. Http://stackoverflow.com/questions/1312922/detect-if-stdin-is-a-terminal-or-pipe-in-c-c-qt – cdarke

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

  • Нет связанных вопросов^_^