ファイルまたはシェル (パイプライン処理用) からの入力を処理するプログラムを作成する必要があります。これに対処する最も効率的な方法は何ですか? 基本的に入力を 1 行ずつ読み取る必要がありますが、入力はシェルからの別のプログラムの出力またはファイルである可能性があります。
ありがとう
コメントのリンクが見つからないので、回答を投稿してください。Eugen Constantin Dinca が言ったように、出力だけを標準入力にパイプまたはリダイレクトするため、プログラムで必要なことは標準入力から読み取ることです。
あなたが言ったように、「行ごとに読む」が何を意味するのかわかりません.ftpインタラクティブモードのようなものですか?その場合、一度に 1 行を読み取り、端末シグナルを与えるまで次の入力を待つループがプログラムにあるはずです。
編集:
int c;
while(-1 != (c = getchar()))
putchar(c);
Echo All Palindromesの C の例を C で示します。
int main(int argc, char* argv[]) {
int exit_code = NO_MATCH;
if (argc == 1) // no input file; read stdin
exit_code = palindromes(stdin);
else {
// process each input file
FILE *fp = NULL;
int ret = 0;
int i;
for (i = 1; i < argc; i++) {
if (strcmp(argv[i], "-") == 0)
ret = palindromes(stdin);
else if ((fp = fopen(argv[i], "r")) != NULL) {
ret = palindromes(fp);
fclose(fp);
} else {
fprintf(stderr, "%s: %s: could not open: %s\n",
argv[0], argv[i], strerror(errno));
exit_code = ERROR;
}
if (ret == ERROR) {
fprintf(stderr, "%s: %s: error: %s\n",
argv[0], argv[i], strerror(errno));
exit_code = ERROR;
} else if (ret == MATCH && exit_code != ERROR)
// return MATCH if at least one line is a MATCH, propogate error
exit_code = MATCH;
}
}
return exit_code;
}
それを C++ に適応させるには:palindromes
を受け入れる関数 (上にあります) を書きますstd::istream&
。std::cin
(標準入力または「-」ファイル名の場合) または関数ifstream
からのオブジェクトのいずれかを渡しmain()
ます。
std::getline()
関数内の特定のオブジェクトで使用して、std::istream
入力を 1 行ずつ読み取ります (関数は、入力がファイルからか標準入力からかを気にしません)。
一緒に使いたい名前付きパイプだと思います。しかし、私が知っていることから、他のプログラムはその出力を名前付きパイプに書き込む必要があり(そのプログラムにアクセスできる場合はそれを行うことができます)、プログラムは名前付きパイプから読み取ります。
これがお役に立てば幸いです。
質問を誤解しているかもしれませんが、プログラムを次のように使用できるようにしたいと思います:cat [some_file] | [your_program]
または[your program] < [some_file]
.
その場合は、標準入力 (stdin/cin) から読み取る必要があるだけでなく、残りはシェルが処理します。
プログラムで標準入力またはファイルから読み取るようにしたい場合は、多くのコマンド ライン ユーティリティが行うこと、つまりcatを実行できます。
cat [OPTION] [FILE]...
...
FILE がない場合、または FILE が - の場合は、標準入力を読み取ります。
上記を実装するコード サンプルについては、この記事を参照してください。