2012-05-18 114 views
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

我通过this post这表明与管道处理来完成我想要什么,但就没有告诉我为什么我上面的代码不工作?

编辑:虽然这将是很好知道的替代品,使上面的工作,因为它应该,我就参与了读同一程序

+0

要提出替代方案,您需要告诉我们您需要什么以及为什么。你想模拟'/ usr/bin/tee'吗? – hamstergene

回答

5

并不是每一个文件是可搜索的stdout的问题比较好奇,可读或可写。标准输出通常是一种无法读回的类型。

最有可能的,stdout将是一个管道。在这种情况下,你的程序保存可写结束,而其他人拥有可读结束。管道实现只是传输数据,并不保留它;一旦它被读到另一端,就没有办法找回来。

如果您希望可以回读文件,创建一个普通的临时文件,或者你自己管,并使用fprintf/fscanf代替printf/scanf。另外,做freopen在stdout重新分配给另一个文件/管,然后printf将在新的文件进行操作。

+0

我不能完全同意你的第一个断言。如果'stdout'不能被读回,shell如何显示其他程序的输出?当我们读取同一个程序的'stdout'时,问题似乎就会出现。 另外,我知道的替代品,但我想知道为什么这个方法不起作用。 –

+0

@Stacker'stdout'通常是一个管道。 shell保存只能读取的结束,并且程序保存只能写入的结尾。 “stdin”的设置完全相反。 – hamstergene

+0

@Stacker实际上,shell甚至不读取程序的输出。和任何直接印刷进行到该终端设备,文件或程序|(piping'如果使用'或文件,如果使用'> redirection',或到另一个程序的标准输入)它连接终端到其标准输出。壳牌可能已经退出。 – hamstergene

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必须从标准输入,而不是从标准输出:)
2)阅读,你不能打印所有的数组printf array必须迭代成它以for cicle

+0

那么,在这种情况下,他正在阅读的字符串,这样他就可以用'%s'写他们也。那有什么问题? – Shahbaz

0

我建议你到你的地方标准输出的位置坐标使用gotoxy,它的一个非常简单的命令。

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