6

これは宿題に関連していると言ってみましょう。ただし、これは割り当ての非常に小さく、比較的重要でない部分です。

C プログラムはコマンド ライン引数を介して入力を受け取りますが、次の形式である必要があります。

$ ./program < input

その入力を文字列として受け取るにはどうすればよいでしょうか。argv から 3 番目の引数を出力しようとするたびに、次のメッセージが表示されます。

入力: そのようなファイルまたはディレクトリはありません。

4

10 に答える 10

21

< はシェル リダイレクトです。プログラムの外部で処理されます。表示されるのは、標準入力ストリームに送信されるファイル名 'input' の内容です。これはプログラムが動作するための一般的な方法ですが、通常はファイル名の指定も処理しますsed

推測する必要がある場合、次のように思います。

input: No such file or directory.

指定されたファイル「input」を開くことができないため、シェルからのものです。

一方、実際に< inputプログラムに as 引数が必要な場合は、それらをエスケープまたは引用して、シェルがそれらを解釈しないようにすることができます。(読者の練習として左にエスケープ:-))。

于 2009-09-29T17:13:08.253 に答える
10

構文は、 「指定されたファイル内のすべてをプログラムの標準エントリに./program < inputリダイレクトする」という特殊なシェル構文です。input

入力を読み取るには、プログラムで標準入力読み取り関数 linefgetsまたはを使用するだけscanfです。

于 2009-09-29T17:13:45.023 に答える
5

*nix システムでは、 の 3 番目の要素はありませargv。ほとんどすべての Unix ライクなシェルでそのコマンドを実行すると、次のようになります。

cat input | ./program

したがって、./programには要素が 1 つしかありませんargvが、それstdinはファイルinputであるため、ファイルを読み取るには、から読み取るだけですstdin。これは、プログラムを設計する上で完全に有効な方法であることに注意してください。多くの Unix プログラムは、ファイルが指定されていない場合、標準入力から読み取るため、他のプログラム (またはこの場合はファイル) からの入力をパイプすることができます。

于 2009-09-29T17:13:44.457 に答える
3

の後に続く<ものは、コマンドライン引数ではありません。ファイルの内容は、シェルによってプログラムにパイプされます。

stdin から読み取るだけで、ファイルの内容を取得できます。

于 2009-09-29T17:13:32.447 に答える
3

「<」をエスケープする必要があります。そうしないと、シェルが解析し、プログラムはコマンドラインでそれを受け取りません。

bash を使用している場合は、次のようになります。

./program '<' input

また

./program \< input

他のシェルでは異なる方法で実行される場合があります (たとえば、Windows のデフォルトの はcmd.exe、 では^なくエスケープ文字として使用されます\)。

于 2009-09-29T17:14:28.577 に答える
0

「<」は省略します。コマンドライン引数でこれを行う必要があります:

$ ./program -Dflag Seven=ixnay FromDinger

アプリケーションで、これを試してください:

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) であり、2 番目の引数 (インデックス 1) は「-Dflag」になります。

于 2009-09-29T17:25:07.383 に答える
0

これは Unix シェルのものです。このフォームsomeprogram < somefileは、 somefile を入力として使用して実行するように someprogram に指示します。シンボルに関連して別のことをしたい場合は<、それを引用する必要があります。

于 2009-09-29T17:15:02.317 に答える
0

プログラムが名前<付きファイル (input) から標準入力 (stdin) を読み取ることを意味します。そのため、stdin から読み取るだけです ( 、 などを使用fgets) fread

于 2009-09-29T17:15:03.037 に答える
0

実際、これはトーナメントのプログラミングで使用される非常に一般的な手法です。プログラムが必要とするデータは、たとえば data.txt というファイルに保存され、次のようにシェルで「<」を使用してアプリケーションにリダイレクトされます: ./program < 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;
}

..そして、ファイルからすべてのデータを文字列で(スペースで区切って)取得します。

それはそれを行う1つの方法です、私はそれが役立つことを願っています. []の

于 2009-09-29T17:49:45.167 に答える
-2

stdin を読み取ることで取得できます。

于 2009-09-29T17:14:58.450 に答える