2011-02-11 15 views
6

こんにちは、私は私が起動した後、我々は再びstdinからの入力を取ることができますどのようにしたい:)(freopenは後に標準入力からの入力を取る

freopen("Smefile.txt","r",stdin); 

まさに私は私のプログラムの最初の私の最初は、指定されたからの入力を取る必要がありますしたいですファイルは次の部分がstdinから取る。

同様:

int a,b; 
freopen("Smefile.txt","r",stdin); 
scanf("%d",&a); 

{ 
    //some block here such that the next cin/scanf takes b from standard input 
} 
cin>> b; 
cout <<a<<" "<<b; 

任意のアイデア?

+1

'stdin'を再利用するのではなく、ファイルに2番目のファイルハンドルを使用するだけではどうですか? –

+0

POが達成しようとしているものには回避策があるかもしれませんが、質問そのものは価値があります。ファイルに対してfreopen()を使用した後にstdinから入力を取ることは可能ですか? –

答えて

8

できません。代わりに

FILE *input = fopen("Smefile.txt","r"); 

// read stuff from file 

fclose(input); 
input = stdin; 

を使用してください。

これは、C++とCスタイルのI/Oを同じストリームにミキシングするときは役に立ちませんが、これはお勧めできません。

(あなたがLinux上であることが起こる場合は、あなたは、Linux/Unixでは、あなたはまた、ジェリーの棺のdup2トリックを使用することができますが、それも毛深いです。代わりに/dev/stdinを再度開くことができます。)

+1

これは私の目的にどのように役立つのですか?私のアプリケーションでは、ファイル全体を最初に読み込んだ後、標準入力から読み込む必要があります。 – Quixotic

+0

@Tretwick:申し訳ありませんが、間違った方法です。 –

+0

Windowsの場合、 'con'デバイス名も(stdinとstdoutの両方に対して)動作します。 Howver、私はstderrをどのように再開できるか分からない。 –

3

それは醜いだと(ソートの)ポータブルではありません。 filenoを使用して、stdinに関連付けられたファイル記述子を取得し、dupを使用してコピーを保持します。次に、あなたはfreopenを行います。完了したら、dup2を使用して、stdinのファイル記述子を以前に保存したファイル記述子に関連付けるので、標準ストリームは開始位置を返します。デモコードについては、Cスニペットコレクションのredirect.cを参照してください。

0

このようにC stdioストリームとC++ IOストリームを混在させることは無効です。結果は未定義です。

関連する問題