Не в состоянии читать со стандартного выхода

Я пытаюсь прочитать 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 той же программы

3 ответа

Решение

Не каждый файл доступен для поиска, чтения или записи. Stdout обычно является видом, который не может быть прочитан обратно.

Более вероятный, stdout будет труба. В этом случае ваша программа имеет доступный для записи конец, а кто-то другой имеет читаемый конец. Реализация канала просто передает данные и не сохраняет их; как только он будет прочитан на другом конце, нет способа вернуть его обратно.

Если вам нужен файл, который можно прочитать обратно, создайте обычный временный файл или свой собственный канал и используйте fprintf/fscanf вместо printf/scanf, Или сделать freopen на стандартный вывод переназначить его в другой файл / канал, затем printf будет работать с этим новым файлом.

Я предлагаю вам использовать gotoxy, это очень простая команда, в которой вы размещаете координаты положения стандартного вывода.

COORD coord={0,0};
void gotoxy(int x,int y){
   coord.X=x;coord.Y=y;
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}

Это правильный код:

#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 должен читать со стандартного ввода, а не со стандартного вывода:)
2) вы не можете распечатать весь массив с printf array, вы должны повторить это с for Cicle

Другие вопросы по тегам