Question

Permettez-moi de commencer par dire ceci est associé à un devoir. Cependant, cela est une très petite et relativement insignifiante de l'affectation.

Le programme de C reçoit une entrée par l'intermédiaire d'arguments de ligne de commande, mais il doit être sous la forme:

$ ./program < input

Comment pourrais-je aller sur la réception de cette entrée comme une chaîne? Chaque fois que je tente d'imprimer le 3ème argument argv Je reçois ce message:

  

entrée. Aucun fichier ou répertoire

Était-ce utile?

La solution

sed.

Si je devais deviner, je pense que le:

input: No such file or directory.

provient de la coque, car il est impossible d'ouvrir le fichier spécifié. « Input »

Par contre, si vous voulez vraiment l'< input comme arguments à votre programme, vous pouvez échapper ou les citer de sorte que le shell ne les interpréter. (Echapper à gauche comme un exercice pour le lecteur: -).)

Autres conseils

La syntaxe de ./program < input est une syntaxe spéciale du shell disant « réexpédie tout dans le fichier nommé input à l'entrée standard du programme ».

Pour lire l'entrée, votre programme suffit d'utiliser les fonctions de lecture d'entrée standard, ligne fgets ou scanf.

Sur les systèmes * nix, il n'y aura pas être un troisième élément de argv. Si vous exécutez cette commande sur presque tous les shell Unix, il sera semblable à faire ceci:

cat input | ./program

Ainsi, votre ./program n'a qu'un seul élément argv, mais il est stdin est le fichier input, donc à lire le fichier que vous venez de lire à partir stdin. Notez que ceci est une façon parfaitement valide pour concevoir votre programme. De nombreux programmes Unix lus depuis l'entrée standard si aucun fichier sont données, afin que vous puissiez pipe dans d'autres programmes (ou dans ce cas, à partir de fichiers).

Qu'est-ce qui vient après l'< est pas un argument de ligne de commande. Le contenu du fichier sera canalisé dans votre programme par le shell.

Tout ce que vous devez faire est de lire de stdin et vous obtiendrez le contenu du fichier.

Vous devez échapper à la « < », sinon shell analysera, et le programme ne recevra pas en ligne de commande.

Si vous utilisez bash, puis:

./program '<' input

ou

./program \< input

D'autres coquilles peuvent le faire différemment (par exemple par défaut de Windows cmd.exe, utilise ^ comme caractère d'échappement, non \).

Ceci est une chose shell Unix. La forme someprogram < somefile dit someprogram à exécuter à l'aide somefile comme entrée. Si vous voulez faire quelque chose de différent impliquant le symbole <, vous aurez besoin de la citer.

Le < signifie que le programme lira est entrée standard (stdin) du fichier nommé (d'entrée). Il suffit donc de lire stdin (en utilisant fgets, fread, etc).

laisser tomber le '<'. Vous voulez que des arguments de ligne de commande font:

  

$ ./program -Dflag sept = Ixnay FromDinger

Dans votre application, essayez ceci:

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

Vous remarquerez que le premier argument est le nom de l'exécutable (à l'index 0), et votre second argument (à l'index 1) sera "-Dflag"

En fait, c'est une technique très courante utilisée dans les tournois de programmation. Les données de votre programme a besoin est stocké dans un fichier, disons data.txt, puis redirigés vers votre application en utilisant le « < » sur la coquille, comme ceci: ./ programme

Alors, dans votre code source, ce que vous devez faire est quelque chose comme ceci:

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

.. et vous obtiendrez toutes les données du fichier sur une chaîne (et séparés par des espaces).

C'est une façon de le faire, j'espère que cela aide. [] 'S

Vous pouvez l'obtenir en lisant stdin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top