LinuxSir.cn,穿越时空的Linuxsir!

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

请教关于write写入read读取的问题

[复制链接]
发表于 2008-3-6 17:13:54 | 显示全部楼层 |阅读模式
程序本来的意图为先调用write()把str写入到文件里 , 然后在用read()读出。
但一直没有得到想要的结果。请大家指点一下
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <string.h>
  6. char str[]="Hello China ! ";
  7. int main(void)
  8. {
  9.         int fd, n;
  10.         char buf[256];
  11.         if ((fd = open("aa", O_RDWR|O_CREAT|O_TRUNC, 0666)) == -1) {
  12.                 printf("open file error.\n");
  13.                 exit(-1);
  14.         }
  15.         if (write(fd, str, strlen(str)) == strlen(str)) {
  16.                 printf("write success!\n");        
  17.                     printf("write_fd=%d\n", fd);
  18.                 if ((n=read(fd, buf, strlen(str))) != -1) {
  19.                         printf("str:%d, read %d \n",strlen(str), n);
  20.                             printf("The file: %s\n", buf );
  21.                 }       
  22.         } else {
  23.                 printf("write file error. \n");
  24.                 exit(-1);
  25.         }
  26.         close(fd);
  27.         exit(0);
  28. }
复制代码

输出结果:
write success!
write_fd=3
str:14, read 0
The file:
发表于 2008-3-6 17:23:41 | 显示全部楼层
我想可能是文件系统缓存。
可以先close一下再读。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-6 17:37:23 | 显示全部楼层
谢谢版主,如果先close(fd)一下倒是可以的。
还有一个问题就是读出的字符输出总会跟一些乱码
输出结果如下:
open_fd=3
write success!
write_fd=3
str:12, read 12
The file: Hello China!U��
回复 支持 反对

使用道具 举报

发表于 2008-3-7 12:56:12 | 显示全部楼层
write() 后要是想直接读刚才的内容的话要先 lseek(fd, 0, SEEK_SET);

至于乱码则是由于缺少字符串结尾的 0, 打印时内存越界了. 给楼主改了一下, 供参考

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <string.h>

  6. char str[]="Hello China ! ";

  7. int main(void)
  8. {
  9.         int fd, n;
  10.         char buf[256];

  11.         if ((fd = open("aa", O_RDWR|O_CREAT|O_TRUNC, 0666)) == -1) {
  12.                 printf("open file error.\n");
  13.                 exit(-1);
  14.         }

  15.         if (write(fd, str, strlen(str)) == strlen(str)) {
  16.                 printf("write success!\n");        
  17.                     printf("write_fd=%d\n", fd);

  18.                 lseek(fd, 0, SEEK_SET);
  19.                 if ((n=read(fd, buf, sizeof(str))) != -1) {
  20.                         buf[n] = 0;
  21.                         printf("read %d \n", n);
  22.                             printf("The file: %s\n", buf );
  23.                 }       
  24.         } else {
  25.                 printf("write file error. \n");
  26.                 exit(-1);
  27.         }

  28.         close(fd);

  29.         exit(0);
  30. }

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-7 15:44:33 | 显示全部楼层
楼上的兄弟说的对,明白了。
谢谢帮忙
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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