Pergunta

Deixe-me começar por dizer que esta está associada a uma tarefa de casa. No entanto, esta é uma parte muito pequena e relativamente insignificante da atribuição.

O programa C recebe entrada via argumentos de linha de comando, mas ele precisa ser no formato:

$ ./program < input

Como, eu iria sobre recebendo essa entrada como uma string? Cada vez que eu tento imprimir o terceiro argumento do argv eu recebo esta mensagem:

Entrada:. Nenhum tal lima ou diretório

Foi útil?

Solução

<é um redirecionamento shell - ele é tratado fora do seu programa. O que você verá é o conteúdo do nome do arquivo 'input' sendo enviados para o seu fluxo de entrada padrão. Esta é uma forma comum para programas de operar, embora eles normalmente também lidar com sendo dado um nome de arquivo, por exemplo, sed.

Se eu tivesse que adivinhar Eu acho que o:

input: No such file or directory.

é proveniente da casca, pois é incapaz de abrir o arquivo especificado:. "Input"

Por outro lado, se você realmente deseja que o < input como argumentos para o seu programa, você pode escapar ou citá-los para que o shell não interpretá-los. (Escapando deixado como um exercício para o leitor: -)).

Outras dicas

A sintaxe ./program < input é uma sintaxe shell especial dizendo "reorienta tudo no arquivo chamado input à entrada padrão do programa".

Para ler a entrada, seu programa só tem que utilizar as funções de leitura de entrada padrão, fgets linha ou scanf.

Em sistemas * nix, haverá não ser um terceiro elemento de argv. Se você executar esse comando em praticamente qualquer Unix-like shell, será semelhante ao fazer isso:

cat input | ./program

Portanto, o seu ./program tem apenas um elemento em argv, mas é stdin é o input arquivo, para ler o arquivo que você acabou de ler a partir stdin. Note-se que esta é uma maneira perfeitamente válida para projetar seu programa. Muitos programas Unix ler da entrada padrão se nenhum arquivo são dadas, de modo que você pode tubo na entrada de outros programas (ou neste caso, a partir de arquivos).

O que vem depois da < não é um argumento de linha de comando. O conteúdo do arquivo será canalizada para o seu programa pelo shell.

Tudo que você precisa fazer é ler de stdin e você vai ter o conteúdo do arquivo.

Você precisa escapar da '<', caso contrário, a Shell irá analisá-lo, eo programa não vai recebê-lo na linha de comando.

Se você estiver usando bash, então:

./program '<' input

ou

./program \< input

Outros conchas pode fazê-lo de forma diferente (default por exemplo Windows, cmd.exe, usa ^ como caractere de escape, não \).

Isso é uma coisa Unix shell. O someprogram < somefile formulário diz someprogram para executar usando somefile como sua entrada. Se você quiser fazer algo diferente envolvendo o símbolo <, você vai precisar para citá-lo.

Os meios < que o programa vai lê-lo da entrada padrão (stdin) do arquivo chamado (entrada). Então, basta ler de stdin (usando fgets, fread, etc).

deixar de fora o '<'. Você quer que os argumentos de linha de comando faça o seguinte:

$ ./program -Dflag sete = ixnay FromDinger

Em seu aplicativo, tente o seguinte:

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

Você notará que o primeiro argumento é o nome do executável (no índice 0), e seu segundo argumento (no índice 1) será "-Dflag"

Na verdade, esta é uma técnica muito comum usada em torneios de programação. Os dados suas necessidades de programa é armazenado em um arquivo, digamos data.txt, e depois redirecionado para seu aplicativo usando o "<" na casca, como este: ./ programa

Assim, em seu código-fonte, o que você precisa fazer é algo como isto:

#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;
}

.. e você vai obter todos os dados do arquivo em uma string (e separados por espaços).

Essa é uma maneira de fazê-lo, espero que ajude. [] 'S

Você pode obtê-lo através da leitura stdin.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top