これは宿題に関連していると言ってみましょう。ただし、これは割り当ての非常に小さく、比較的重要でない部分です。
C プログラムはコマンド ライン引数を介して入力を受け取りますが、次の形式である必要があります。
$ ./program < input
その入力を文字列として受け取るにはどうすればよいでしょうか。argv から 3 番目の引数を出力しようとするたびに、次のメッセージが表示されます。
入力: そのようなファイルまたはディレクトリはありません。
これは宿題に関連していると言ってみましょう。ただし、これは割り当ての非常に小さく、比較的重要でない部分です。
C プログラムはコマンド ライン引数を介して入力を受け取りますが、次の形式である必要があります。
$ ./program < input
その入力を文字列として受け取るにはどうすればよいでしょうか。argv から 3 番目の引数を出力しようとするたびに、次のメッセージが表示されます。
入力: そのようなファイルまたはディレクトリはありません。
< はシェル リダイレクトです。プログラムの外部で処理されます。表示されるのは、標準入力ストリームに送信されるファイル名 'input' の内容です。これはプログラムが動作するための一般的な方法ですが、通常はファイル名の指定も処理しますsed
。
推測する必要がある場合、次のように思います。
input: No such file or directory.
指定されたファイル「input」を開くことができないため、シェルからのものです。
一方、実際に< input
プログラムに as 引数が必要な場合は、それらをエスケープまたは引用して、シェルがそれらを解釈しないようにすることができます。(読者の練習として左にエスケープ:-))。
構文は、 「指定されたファイル内のすべてをプログラムの標準エントリに./program < input
リダイレクトする」という特殊なシェル構文です。input
入力を読み取るには、プログラムで標準入力読み取り関数 linefgets
またはを使用するだけscanf
です。
*nix システムでは、 の 3 番目の要素はありませんargv
。ほとんどすべての Unix ライクなシェルでそのコマンドを実行すると、次のようになります。
cat input | ./program
したがって、./program
には要素が 1 つしかありませんargv
が、それstdin
はファイルinput
であるため、ファイルを読み取るには、から読み取るだけですstdin
。これは、プログラムを設計する上で完全に有効な方法であることに注意してください。多くの Unix プログラムは、ファイルが指定されていない場合、標準入力から読み取るため、他のプログラム (またはこの場合はファイル) からの入力をパイプすることができます。
の後に続く<
ものは、コマンドライン引数ではありません。ファイルの内容は、シェルによってプログラムにパイプされます。
stdin から読み取るだけで、ファイルの内容を取得できます。
「<」をエスケープする必要があります。そうしないと、シェルが解析し、プログラムはコマンドラインでそれを受け取りません。
bash を使用している場合は、次のようになります。
./program '<' input
また
./program \< input
他のシェルでは異なる方法で実行される場合があります (たとえば、Windows のデフォルトの はcmd.exe
、 では^
なくエスケープ文字として使用されます\
)。
「<」は省略します。コマンドライン引数でこれを行う必要があります:
$ ./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」になります。
これは Unix シェルのものです。このフォームsomeprogram < somefile
は、 somefile を入力として使用して実行するように someprogram に指示します。シンボルに関連して別のことをしたい場合は<
、それを引用する必要があります。
プログラムが名前<
付きファイル (input) から標準入力 (stdin) を読み取ることを意味します。そのため、stdin から読み取るだけです ( 、 などを使用fgets
) fread
。
実際、これはトーナメントのプログラミングで使用される非常に一般的な手法です。プログラムが必要とするデータは、たとえば 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つの方法です、私はそれが役立つことを願っています. []の
stdin を読み取ることで取得できます。