2

私はstdout自分のプログラムをこのように2つの配列に読み込もうとしています

#include<stdio.h>

int main ()
{
    char arr[100]={0};
    char arr2[100]={0};

    printf("Hello world\n"); // This writes to stdout

    fgets( arr, 80, stdout );

    fseek ( stdout, 0, SEEK_SET );

    fgets ( arr2, 80, stdout );
    printf ("First array is %s\n", arr );
    printf ("Second array is %s\n", arr2 );

    return 0;

}

出力は私が期待するものではありません。つまり、両方の配列はHello World、私が期待したように含まれているのではなく、空です。

私はこの投稿を読んで、私が望むことを達成するためにパイプを扱うことを提案していますが、上記のコードが機能しない理由を教えてくれませんか?

編集:stdout上記を正しく機能させるための代替案を知っているといいのですが、同じプログラムを読むことに伴う問題についてもっと興味があります

4

3 に答える 3

5

すべてのファイルがシーク可能、読み取り可能、または書き込み可能であるとは限りません。Stdoutは通常、読み戻すことができない種類です。

ほとんどのstdout場合、パイプになります。その場合、あなたのプログラムは書き込み可能な端を保持し、他の誰かが読み取り可能な端を保持します。パイプの実装はデータを転送するだけで、データを保持しません。もう一方の端で読み取られると、元に戻す方法はありません。

読み戻すことができるファイルが必要な場合は、通常の一時ファイルまたは独自のパイプを作成し、/の代わりに/をfprintf使用fscanfprintfますscanf。または、freopenstdoutを実行して別のファイル/パイプに再割り当てしてからprintf、その新しいファイルを操作します。

于 2012-05-18T06:53:56.167 に答える
0

gotoxy を使用することをお勧めします。これは、stdout の位置の座標を配置する非常に単純なコマンドです。

COORD coord={0,0};
void gotoxy(int x,int y){
   coord.X=x;coord.Y=y;
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
于 2013-12-17T17:03:55.970 に答える
0

これは正しいコードです:

#include<stdio.h>

int main ()
{
char arr[100]={0};
char arr2[100]={0};
int i,j;

printf("Hello world\n"); // This writes to stdout

fgets( arr, 80, stdin );

fgets ( arr2, 80, stdin );
printf("\n");
for(i=0; i<80; i++){
    printf ("%c", arr[i]);
}
for(j=0; j<80; j++){
    printf ("%c", arr2[j]);
}

return 0;
}

1) fgets は stdout からではなく、 stdinから読み取る必要があります :) 2 )を
使用してすべての配列を出力することはできません。printf arrayfor

于 2012-05-18T07:01:15.690 に答える