C 标准输出/标准输入和参数
我的程序有点小问题,我不知道如何解决。只要不包含C 标准输出/标准输入和参数,c,pipe,stdout,stdin,getopt,C,Pipe,Stdout,Stdin,Getopt,我的程序有点小问题,我不知道如何解决。只要不包含getopt(无参数),我的程序就可以正常工作 我写了两个简单的程序服务器和客户端 服务器在stdout中写入数字,客户端应使用stdin读取数字 此外,程序应该能够被参数调用 例如,程序调用如下所示: Terminal: ./Server -f72 | ./Client -r22 int main(int argc , char *argv[]) { int i; FILE *ziel; ziel=stdout;
getopt
(无参数),我的程序就可以正常工作
我写了两个简单的程序服务器和客户端
服务器在stdout
中写入数字,客户端应使用stdin
读取数字
此外,程序应该能够被参数调用
例如,程序调用如下所示:
Terminal: ./Server -f72 | ./Client -r22
int main(int argc , char *argv[])
{
int i;
FILE *ziel;
ziel=stdout;
int option;
char buf[50];
while ((option = getopt(argc, argv,"f:tr:d:j")) != -1)
{
switch (option)
{
case 'f' :
strcpy(buf,optarg);
break;
case 't' :
break;
case 'r' :
strcpy(buf,optarg);
break;
default:
//printf("1ERROR");
exit(EXIT_FAILURE);
}
}
for(i=1;i>0;i++)
{
fprintf(ziel,"%d\n",i);
sleep(1);
}
return 0;
}
int main(int argc , char *argv[])
{
FILE* cl;
cl=stdin;
int i;
int zahl[10];
int option;
char buf[50];
while ((option = getopt(argc, argv,"f:tr:")) != -1)
{
switch (option)
{
case 'f' :
puts("Here is f");
strcpy(buf,optarg);
puts(buf);
break;
case 't' :
puts("Here is t");
break;
case 'r' :
puts("Here is r");
strcpy(buf,optarg);
puts(buf);
break;
default:
printf("ERROR");
exit(EXIT_FAILURE);
}
}
puts("Waiting for Server");
for(i=0;i<10;i++)
{
fscanf(cl,"%d",&zahl[i]);
printf("Received %d\n ",zahl[i]);
}
return 0;
}
如果我运行这个程序,它只会打印带有参数“22”和“等待服务器”的“Her is r”,但它应该打印来自服务器的数字
我找不到这个错误。我非常感谢你的帮助。提前感谢所有读到这篇文章的人
服务器:
Terminal: ./Server -f72 | ./Client -r22
int main(int argc , char *argv[])
{
int i;
FILE *ziel;
ziel=stdout;
int option;
char buf[50];
while ((option = getopt(argc, argv,"f:tr:d:j")) != -1)
{
switch (option)
{
case 'f' :
strcpy(buf,optarg);
break;
case 't' :
break;
case 'r' :
strcpy(buf,optarg);
break;
default:
//printf("1ERROR");
exit(EXIT_FAILURE);
}
}
for(i=1;i>0;i++)
{
fprintf(ziel,"%d\n",i);
sleep(1);
}
return 0;
}
int main(int argc , char *argv[])
{
FILE* cl;
cl=stdin;
int i;
int zahl[10];
int option;
char buf[50];
while ((option = getopt(argc, argv,"f:tr:")) != -1)
{
switch (option)
{
case 'f' :
puts("Here is f");
strcpy(buf,optarg);
puts(buf);
break;
case 't' :
puts("Here is t");
break;
case 'r' :
puts("Here is r");
strcpy(buf,optarg);
puts(buf);
break;
default:
printf("ERROR");
exit(EXIT_FAILURE);
}
}
puts("Waiting for Server");
for(i=0;i<10;i++)
{
fscanf(cl,"%d",&zahl[i]);
printf("Received %d\n ",zahl[i]);
}
return 0;
}
客户端:
Terminal: ./Server -f72 | ./Client -r22
int main(int argc , char *argv[])
{
int i;
FILE *ziel;
ziel=stdout;
int option;
char buf[50];
while ((option = getopt(argc, argv,"f:tr:d:j")) != -1)
{
switch (option)
{
case 'f' :
strcpy(buf,optarg);
break;
case 't' :
break;
case 'r' :
strcpy(buf,optarg);
break;
default:
//printf("1ERROR");
exit(EXIT_FAILURE);
}
}
for(i=1;i>0;i++)
{
fprintf(ziel,"%d\n",i);
sleep(1);
}
return 0;
}
int main(int argc , char *argv[])
{
FILE* cl;
cl=stdin;
int i;
int zahl[10];
int option;
char buf[50];
while ((option = getopt(argc, argv,"f:tr:")) != -1)
{
switch (option)
{
case 'f' :
puts("Here is f");
strcpy(buf,optarg);
puts(buf);
break;
case 't' :
puts("Here is t");
break;
case 'r' :
puts("Here is r");
strcpy(buf,optarg);
puts(buf);
break;
default:
printf("ERROR");
exit(EXIT_FAILURE);
}
}
puts("Waiting for Server");
for(i=0;i<10;i++)
{
fscanf(cl,"%d",&zahl[i]);
printf("Received %d\n ",zahl[i]);
}
return 0;
}
intmain(intargc,char*argv[])
{
文件*cl;
cl=stdin;
int i;
int-zahl[10];
int选项;
char-buf[50];
while((option=getopt(argc,argv,“f:tr:”)!=-1)
{
开关(选件)
{
案例“f”:
puts(“这里是f”);
strcpy(buf、optarg);
put(buf);
打破
案例“t”:
puts(“这是t”);
打破
案例“r”:
puts(“这是r”);
strcpy(buf、optarg);
put(buf);
打破
违约:
printf(“错误”);
退出(退出失败);
}
}
puts(“等待服务器”);
对于(i=0;i您的示例中的问题与getopt
无关。它与输出缓冲有关
如果你等待的时间足够长,一次过就会出现一连串的数字
我通过修改服务器程序使其工作
- 删除
睡眠(1)
- 或者在
fprintf之后使用fflush(stdout);
- 在终端中打印时,遇到换行符时会刷新输出,这就解释了它工作的原因
- 在重定向输出中打印时,会发生缓冲。您必须显式地刷新缓冲区(C库可以决定无论如何刷新,但这里不是这样)
您无法从客户端控制这一点。在您的情况下,即使通过管道将服务器连接到more
也不起作用
请在此阅读:
注意:您可能会愚弄您的服务器程序,使其相信它是在tty
中编写的,这有点黑客行为,但可以工作:
(我目前没有Windows解决方案)然后运行/Server-f72
发出正确的数字?是的。我也在另一个程序中使用它,其中参数很重要,程序(在哪个管道上)只打印参数字符串。那么上面的示例可以工作吗?在这种情况下,它不是一个。你确定你的其他程序没有使用stderr
而不是吗>stdout
?你必须发布真实的案例和控制台输出。你真的确定getopt
是罪魁祸首吗?因为我非常怀疑。我昨天已经做了。这个例子不起作用。我确定我使用了stdout,我定义了一个指向它的指针。如果你不相信我,我可以发布一些终端屏幕截图。我相信你有一个问题,你不会发布一个问题来打扰我们:)我对复制机和原因有疑问,仅此而已。非常感谢!!!我没有想到。睡眠只是模拟了我需要计算我想要发送的值的时间,但它现在起作用了