| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4670 人关注过本帖, 1 人收藏
标题:用C语言,如何实现接收管道输出的结果,并显示。
只看楼主 加入收藏
mxx24680
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-7-18
收藏(1)
 问题点数:0 回复次数:16 
用C语言,如何实现接收管道输出的结果,并显示。
如题,例如编译后的可执行C程序名为myprog
在操作系统环境下,执行如下命令:
$ date +%Y-%m-%d | myprog
得到结果如下:
2010-01-20

请问这个myprog.c程序如何编写,谢谢了。

[ 本帖最后由 mxx24680 于 2010-1-20 10:55 编辑 ]
搜索更多相关主题的帖子: 管道 C语言 输出 结果 
2010-01-20 10:53
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
占个座儿.

这道题很有意思,现在没时间,晚上写吧.
2010-01-20 12:20
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
把下面的这个程序存储为  myprog  ,然后就可以实现您所需要的效果了.

程序代码:
#include <stdio.h>
#include <time.h>

int main(void)
{
    time_t nowtime;
    struct tm *timeinfo;
    time( &nowtime );
    timeinfo = localtime( &nowtime );
    int year, month, day;
    year = timeinfo->tm_year + 1900;
    month = timeinfo->tm_mon + 1;
    day = timeinfo->tm_mday;
    printf("%d -%d -%d\n", year, month, day);

    return 0;
}
2010-01-20 13:55
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
意思不是这样的吧,在DOS下打入命令是加参数的。
如输入:myprog %Y-%m-%d
  显示:2010-01-20
·
如输入:myprog %m-%d-%Y
  显示:01-20-2010
这样才有点意思!

努力—前进—变老—退休—入土
2010-01-20 14:29
树上月
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:114
专家分:154
注 册:2010-1-6
收藏
得分:0 
不懂。。。。

每一个不曾起舞的日子,都是对未来的一种辜负......
2010-01-20 15:00
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
回复 4楼 UserYuH
那就判断 argv 的参数再决定输出格式,但大致上的思路应该是这样的吧?
2010-01-20 16:23
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
收藏
得分:0 
以下是引用广陵绝唱在2010-1-20 16:23:59的发言:

那就判断 argv 的参数再决定输出格式,但大致上的思路应该是这样的吧?

没你想的那么简单,这个程序涉及到管道读写和进程方面的东西。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    int len  ;
    int apipe[2] ;
    int i ;
    char buf[256] ;
    if (pipe(apipe) == -1) {
        perror("can not create a pipe\n") ;
        exit(1) ;
    }
    while (fgets(buf , 256 , stdin)) {
        len = strlen(buf) ;
        if (write(apipe[1] , buf , len) != len) {
            perror("writing to pipe") ;
            break ;
        }
        for (i = 0 ; i < len ; i++)
            buf[i] = '\0' ;
        len = read(apipe[0] , buf , 256) ;
        if (len == -1) {
            perror("reading form pipe") ;
            break ;
        }
            if (write(1 , buf , len) != len) {
            perror("writing to stdout") ;
            exit(1) ;
        }
    }
 return 0 ;
}

[ 本帖最后由 iFreeBSD 于 2010-1-20 20:00 编辑 ]

without further ado, let’s get started
2010-01-20 19:56
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
回复 7楼 iFreeBSD
谢谢指教.
2010-01-20 20:31
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
回复 6楼 广陵绝唱
其实这个问题没有那么复杂,只要了解管道的实质含义就行了
在shell里利用“|”管道干的事情就是io重定向,把“|”命令前的输出重定向到“|”后的标准输入中也就是c程序的stdin流中,所以要实现楼主所得功能程序只要跟原来的样就行了。例如
#include <stdio.h>

int main(void)
{
        char string[512];
        fgets(string ,512,stdin);
        puts(string);
        return 0;
}
收到的鲜花
  • 广陵绝唱2010-01-21 10:53 送鲜花  49朵   附言:谢谢.

身体是玩命的本钱
2010-01-21 02:02
mxx24680
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-7-18
收藏
得分:0 
谢谢各位大侠的指点,真的受益非浅,感谢各位了!
尤其感谢zhddragon大侠的赐教,确实解决了我的问题,谢谢了。
在此向以上各位大侠鞠躬致谢了。
2010-01-21 09:55
快速回复:用C语言,如何实现接收管道输出的结果,并显示。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013852 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved