LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3327|回复: 26

怎么把一个文件得内容读取到标准输出?(请帮改改以下的程序)

[复制链接]
发表于 2003-12-24 16:15:52 | 显示全部楼层 |阅读模式
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "ourhdr.h"
#define BUFFSIZE 512
int main (void)
{
int n,fd;
char buff[BUFFSIZE];
if((fd=open("/root/fstab",O_RDONLY) == -1)) { /*打开/root/fstab,如果错误就退出*/
     printf("open error\n");
      exit (0);
    }
else {
while (( n=read(fd,buff,BUFFSIZE)) >0) /* 读文件  */
  if(write(STDOUT_FILENO,buff,n) == 0)
    /*把文件写到标准输出。不知道这样想对不对。 */
         printf("write error\n");
if (n<0)
   printf("read error\n");
}
exit (0);
}
===========
# ./a.out
2432  <---------我输入的内容
2432  <---------程序输出的内容
sdfs
sdfs
^C
#

要求是输出/root/fstab的内容到标准输出,就象用cat /root/fstab的效果。
想不出怎么做,请帮帮忙!!
发表于 2003-12-24 17:14:27 | 显示全部楼层
什么意思?
 楼主| 发表于 2003-12-24 17:37:39 | 显示全部楼层
抱歉!!!!说得不明白现在补充上了。
发表于 2003-12-24 22:15:55 | 显示全部楼层
呵呵,抱歉,这忙我是帮不上了,关于文本方面的我一直都喜欢用perl,那才叫高效率啊,打开fstab把内容放到数组里,一个foreach就全出来了
 楼主| 发表于 2003-12-24 23:21:36 | 显示全部楼层
现在知道错误了。是这里错了。
if((fd=open("/root/fstab",O_RDONLY) == -1))
改正了就能cat /root/fstab了,觉的这个程序用了多个函数,还有更优化的算法吗?
发表于 2003-12-25 00:53:54 | 显示全部楼层
既然有ourhdr.h,有些东西就应该用,比如err_sys

  1. #include <fcntl.h>
  2. #include "ourhdr.h"

  3. #define BUFFSIZE 512

  4. int
  5. main(void)
  6. {
  7.   int n, fd;
  8.   char buff[BUFFSIZE];
  9.   
  10.   if((fd = open("/root/fstab", O_RDONLY)) < 0)
  11.     err_sys("cannot open /root/fstab");
  12.   while((n = read(fd, buff, BUFFSIZE)) >0)
  13.     if(write(STDOUT_FILENO, buff, n) != n)
  14.       err_sys("write error");
  15.   if(n < 0)
  16.     err_sys("read error");

  17.   exit (0);
  18. }
复制代码

ourhdr.h里有MAXLINE,这个也可以直接用,不用BUFFSIZE
发表于 2003-12-25 01:08:52 | 显示全部楼层
如果你没有ourhdr,我这里有一个,ourhdr.tar.gz,解开以后包含两个文件(ourhdr.h、libourhdr.a),你可以在$HOME下建一个ourhdr目录,把文件拷进去,再写一个解释器文件our:
#! /usr/bin/make -f

CC=gcc
CFLAGS=-I/home/xxx/ourhdr -L/home/xxx/ourhdr #这里改成你的目录
LDLIBS=-lourhdr
加上可执行权限,放到$PATH目录里,以后编译的时候就用our yyy (比如文件是yyy.c)就可以了。

我的libourhdr.a里包含err.c和log.c,不过其他函数只包含到11.10,后面的就没了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2003-12-25 15:21:37 | 显示全部楼层
谢谢斑竹~~
我照抄书的例子不能通过,你给的例子也一样,所以我就不用err_sys()等函数了:

# gcc -c test.c
# rm *o
# gcc test.c
/tmp/cc8pYMHI.o(.text+0x37): In function `main':
: undefined reference to `err_sys'
/tmp/cc8pYMHI.o(.text+0x89): In function `main':
: undefined reference to `err_sys'
/tmp/cc8pYMHI.o(.text+0xa1): In function `main':
: undefined reference to `err_sys'
collect2: ld returned 1 exit status
#
why?
发表于 2003-12-25 15:34:36 | 显示全部楼层
ourhdr.h和err_sys等函数在附录B
 楼主| 发表于 2003-12-25 15:39:55 | 显示全部楼层
不能使用new.请帮看看:
解开的两个文件放到/root/lib/
# cat /root/bin/new
#!/usr/bin/make -f  #/usr/bin/make存在
CC=gcc
CFLAGS=-I/root/lib -L/root/lib
LDLIBS=-lourhdr
#chmod 700 /root/bin/new /root/lib/*
# file /root/bin/new
/root/bin/new: a /usr/bin/make -f script text executable
#mv cp.c cp
#new cp
make: Nothing to be done for `cp'.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表