Чтение аргументов командной строки после '<' в С

StackOverflow https://stackoverflow.com/questions/1493839

  •  18-09-2019
  •  | 
  •  

Вопрос

Позвольте мне начать с того, что это связано с домашним заданием.Однако это очень маленькая и относительно незначительная часть задания.

Программа C получает входные данные через аргументы командной строки, но они должны быть в форме:

$ ./program < input

Как, я мог бы получить этот ввод в виде строки?Каждый раз, когда я пытаюсь распечатать 3-й аргумент из argv, я получаю это сообщение:

входные данные:Такого файла или каталога нет.

Это было полезно?

Решение

< является перенаправлением оболочки - оно обрабатывается вне вашей программы.То, что вы увидите, - это содержимое файла с именем 'input', отправляемого в ваш стандартный поток ввода.Это обычный способ работы программ, хотя они обычно также обрабатывают присвоение имени файла, например sed.

Если бы мне пришлось гадать, я бы подумал, что:

input: No such file or directory.

исходит из командной строки, так как она не может открыть указанный файл:"ввод".

С другой стороны, если вы действительно хотите < input в качестве аргументов вашей программы вы можете экранировать их или заключать в кавычки, чтобы оболочка не интерпретировала их.(Экранирование оставлено в качестве упражнения для читателя :-)).

Другие советы

В ./program < input синтаксис - это специальный синтаксис оболочки, говорящий "Перенаправляет все, что находится в файле с именем input к стандартному входу в программу".

Чтобы прочитать входные данные, вашей программе просто нужно использовать стандартные функции чтения входных данных, line fgets или scanf.

В системах * nix не будет быть третий элемент argv.Если вы выполните эту команду практически в любой Unix-подобной оболочке, это будет похоже на выполнение этого:

cat input | ./program

Так что ваш ./program имеет только один элемент в argv, но это stdin является ли файл input, таким образом , чтобы прочитать файл, который вы бы только что прочитали из stdin.Обратите внимание, что это совершенно верный способ разработки вашей программы.Многие программы Unix считывают данные из стандартного ввода, если не указаны файлы, так что вы можете передавать входные данные из других программ (или, в данном случае, из файлов).

Что происходит после < не является аргументом командной строки.Содержимое файла будет передано в вашу программу командной оболочкой.

Все, что вам нужно сделать, это прочитать из stdin, и вы получите содержимое файла.

Вам нужно сбежать от '<', в противном случае оболочка проанализирует его, и программа не получит его в командной строке.

Если вы используете bash, то:

./program '<' input

или

./program \< input

Другие оболочки могут делать это по-другому (напримерЗначение по умолчанию для Windows, cmd.exe, использует ^ как экранирующий символ, а не \).

Это оболочка Unix.Форма someprogram < somefile сообщает someprogram о запуске, используя somefile в качестве входных данных.Если вы хотите сделать что-то другое, включающее < символ, вам нужно будет заключить его в кавычки.

В < означает, что программа будет считывать свой стандартный ввод (stdin) из именованного файла (input).Так что просто прочитайте из stdin (используя fgets, fread, и т.д.).

Отстаньте от '<'.Если вам нужны аргументы командной строки, сделайте это:

$ ./program -Dflag seven=ixnay от Dinger

В вашем приложении попробуйте это:

int main( int argc, char **argv )
{
   int i;
   for( i = 0 ; i < argc ; ++i )
      printf( "Arg %d = %s\n", i, argv[i] );
   return 0;
}

Вы заметите, что первым аргументом является имя исполняемого файла (с индексом 0), а вашим вторым аргументом (с индексом 1) будет "-Dflag".

На самом деле, это очень распространенный прием, используемый в турнирах по программированию.Необходимые вашей программе данные хранятся в файле, скажем data.txt , а затем перенаправляются в ваше приложение с помощью "<" на панцире, вот так: ./программа < data.txt

Итак, в вашем исходном коде вам нужно сделать что-то вроде этого:

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
    string tmp;
    string full_content;

    while (cin >> tmp)
        full_content += " "+tmp;

    cout << full_content << endl;
}

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

Это один из способов сделать это, я надеюсь, это поможет.[]'ы

Вы можете получить это, прочитав stdin.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top