2016-05-25 1 views
0

私は比較のために、ファイル内のすべての行とstdin内のすべての行をループしています。 whileループでfgetsを入れ子にすると、外側ループは2回目には行きません。私は、内側のループがファイルであった場合、最初の行にリセットするために閉じられる可能性があることを見てきましたが、stdinで同じことをすることはできません。 stdinの始めに再起動する方法はありますか?fgetsをstdinでネストする

while (fgets(fline, sizeof(fline), fileInput)){ 
    while (fgets(line, sizeof(line), stdin)){ 
     printf("%s", fline); 
     printf("%s", line); 
    } 
    fclose(fileInput); 
} 

ファイル入力は

a 
b 
c 

とstd内に含まれている場合

d 
e 

私はあなたがきた、内側のループが完了した後、それは

a 
d 
a 
e 
b 
d 
b 
e 
c 
d 
c 
e 
+0

'stdin'がファイルではなくキーボードを指している場合、キーボードはバックアップできないので、バックアップする方法はありません。しかし、 'stdin'がファイルを指している場合、' fseek() 'のようなものを使ってファイルにバックアップすることができます。 – user3629249

答えて

3

を印刷したいでしたの終わりに達しました。だから、あなたが外側ループの次の反復に行くと、stdinに何も残っていないので、内側のループはすぐに終了します。

stdinと仮定するとシーク可能なストリーム(例えば、通常のファイル)に接続されている、あなたは、内側のループの前に戻って先頭に巻き戻すことにより、この問題を解決することができます。

ループ内でfileInputをクローズしていたという別の問題がありました。だから、そのファイルの最初の行を読んだら、ファイルを閉じていたので、次の行を読み込もうとするとエラーが発生しました。

while (fgets(fline, sizeof(fline), fileInput)){ 
    rewind(stdin); 
    while (fgets(line, sizeof(line), stdin)){ 
     printf("%s", fline); 
     printf("%s", line); 
    } 
} 
fclose(fileInput); 

より一般的な溶液は、次いで、アレイにstdinを読み取るfgetsループを使用する代わりに、配列を反復することであろう。