LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: devel

怎么每次读和写一个字节从一个文件?

[复制链接]
发表于 2004-3-27 22:09:22 | 显示全部楼层
&c有什么问题吗?取变量c的地址
char c;
&c就是char *
象你前面写的
char *c;
那么&c就成了char **了
 楼主| 发表于 2004-3-27 22:21:10 | 显示全部楼层
最初由 libinary 发表
&c有什么问题吗?取变量c的地址
char c;
&c就是char *
象你前面写的
char *c;
那么&c就成了char **了


:thank 经你上贴的解释,现在懂了。。:thank
 楼主| 发表于 2004-3-27 22:45:28 | 显示全部楼层
清问改成这样怎么会不行??
char c;
&c +=1; /* memory point add 1 byte */
  

这是测试的程序:

  1. int
  2. main(void)
  3. {
  4.   char a;
  5.   printf("%p  %p\n",&a,&a+1);
  6.   printf("%p\n",&a+sizeof(char));
  7.   return(0);
  8. }
  9. # ./a.out
  10. 0xbfffed67  0xbfffed68
  11. 0xbfffed68
复制代码
发表于 2004-3-28 00:18:50 | 显示全部楼层
你应该找一本C语言的书,把指针这一章好好读一下
char c;定义了一个变量
&c取变量c的地址,但是取到的地址可不是变量,比如你的例子
&c是0xbfffed67,那么
&c += 1;就成了0xbfffed67 += 1;当然不对了
或者说&c不是一个左值(lvalue)
发表于 2004-3-28 12:21:56 | 显示全部楼层
这个为什么有错误,请问错在哪里?


  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5. int
  6. main(void)
  7. {

  8.      char   buf[10];
  9.      int    fd;
  10.      unsigned loop;
  11.      if((fd=open("/etc/fstab",O_RDONLY))<0) { /* open /etc/fstab file */
  12.             printf("open fstab error\n");
  13.             return(1);
  14.      }
  15.      if(read(fd,buf,10) != 10) {
  16.             printf("read error\n");
  17.             return(1);
  18.      }
  19.      for(loop=0;loop<10;loop++) {
  20.             if(fputs(buf[loop],stdout)<0) {
  21.                     printf("fputs error\n");
  22.                     return(1);
  23.             }
  24.      }
  25.      return(0);
  26. }
  27. # gcc -c get_1_byte_v3.c
  28. get_1_byte_v3.c: In function `main':
  29. get_1_byte_v3.c:21: warning: passing arg 1 of `fputs' makes pointer from integer without a cast
复制代码
发表于 2004-3-28 12:54:47 | 显示全部楼层
我不太明白你这段要实现什么功能:

  1. for(loop=0;loop<10;loop++) {
  2.   if(fputs(buf[loop],stdout)<0) {
  3.     printf("fputs error\n");
  4.     return(1);
  5.   }
  6. }
复制代码

如果是输出单个字符的话应该用
if(fputc(buf[loop], stdout) == EOF)
发表于 2004-3-28 13:16:56 | 显示全部楼层
谢谢!!这是一次写一个字符,,看来函数不能乱用。。
发表于 2004-3-29 12:39:57 | 显示全部楼层
这个程序在UNIX下就可以编译并正常运行,在LINUX就不可以编译通过,在LINUX怎么些呢?

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. int
  5. main(void)
  6. {
  7.      int        fd,n;
  8.      char       buf[10];
  9.      if((fd=open("/etc/fstab",O_RDONLY))<0) {
  10.                printf("open file error\n");
  11.                return(1);
  12.      }
  13.      for(n=0;n<10;n++) {
  14.                if(read(fd,&buf[n],1) != 1 ) {
  15.                         printf("read error\n");
  16.                         return(1);
  17.                }
  18.                if(write(STDOUT_FILENO,&buf[n],1) == NULL ) {
  19.                         printf("write error\n");
  20.                         return(1);
  21.                }
  22.      }
  23.      return(0);
  24. }
  25. # gcc -c get_1_byte.d.c
  26. get_1_byte.d.c: In function `main':
  27. get_1_byte.d.c:18: warning: comparison between pointer and integer

复制代码

:help
发表于 2004-3-29 16:23:52 | 显示全部楼层
晕?!!write()返回的是字节数,并且出错是返回的是-1。if(write(STDOUT_FILENO,&buf[n],1) == NULL )应该改成if(write(STDOUT_FILENO,&buf[n],1) < 0 )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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