-1

次のように main 関数のプロトタイプを持つ C++ プログラムがあります。

int main(int argc, char * argv[])

コードは私が書いたものではありませんが、ここで入手できる単一の C ファイルです。このコードをコンパイルすると、コマンド ラインから次のように実行されます。

someexe in.txt > out.txt
これにより、in.txt からの入力を操作して同じディレクトリに生成される出力 out.txt が得られます。

someexe in.txt out.txt
これにより、コマンドライン自体に出力が表示されます。(>演算子を使用せずに)

ただし、コマンドライン引数を渡す代わりに、出力リダイレクト>演算子を使用せずに、別の関数からメイン関数を呼び出して、自分でパラメーターを渡そうとしています。{fileDirName, in.txt}の配列を渡すとchar*、out.txt を生成する方法がわかりません (>出力リダイレクトはコマンド ラインで使用できるオペレーティング システム レベルの機能だと思うため)。

どんな提案でも大歓迎です

リンク先のプログラムはコピペですぐに入手でき、試すことができます(メイン関数は上記プログラムの最後に書いてあります)

4

2 に答える 2

0

別のプログラムのソース内から別の main() を呼び出すことはできません - main() は特別です。

このソース コードをライブラリとして再利用する場合は、main() の名前を別の名前に変更する必要があります。

ただし、通常の Unix の方法でパイプまたはファイル (myprog < input.txtまたは などmyprog input.txt) からの入力を処理する場合は、透過的に処理するのが少し難しくなります。

最良の方法は、コンパイルされたプログラムを新しいプログラム内から別のプロセスとして呼び出し、正しいコマンドライン パラメーターを渡すことです。呼び出しのexec() ファミリを参照してください。

于 2012-05-04T20:27:11.030 に答える
0

シェルの出力リダイレクト機能 ( ) を模倣することが目的であると仮定すると、> out.txt次のようなことができます。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <unistd.h>
#include <iostream>

int main() {
  int fd = open("out.txt", O_WRONLY|O_CREAT|O_TRUNC, 0660);
  assert(fd >= 0);
  const int ret = dup2(fd, 1);  
  assert(ret >= 0);
  std::cout << "Hello redirected world!" << std::endl;
  close(fd);
}

入力リダイレクトを模倣するために、stdin についても同様のことができます ( < in.txt)。これらは呼び出し間でも保持されexec()ます。

もちろん、ソースが利用可能であれば、プログラムを変更して、必要な場所に書き込む方が簡単です。

ただし、dup2()開いたばかりの stdout fd を「スワップ」するのは移植性がないことに注意してください。IIRC open()(とは対照的にfopen()) は UNIX 固有でもあります)

于 2012-05-04T20:35:58.193 に答える