LinuxSir.cn,穿越时空的Linuxsir!

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

lseek程序,帮我看看

[复制链接]
发表于 2005-2-22 19:59:05 | 显示全部楼层 |阅读模式
如启用添加标志打开一文件以便读、写,能否用l s e e k在任一位置开始读?能否
用l s e e k更新文件中任一部分的数据?请写一段程序以验证之。
 楼主| 发表于 2005-2-23 05:24:07 | 显示全部楼层
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<sys/types.h>
  4. #include<sys/stat.h>
  5. #include<fcntl.h>
  6. #include"err_exit.h"
  7. main(int argc,char *argv[])
  8. {
  9.    int fd,n;char a;
  10.    char *buf[BUFSIZ];
  11.    if(argc!=2){
  12.         printf("error\n");
  13.         exit(1);
  14.    }
  15.    if((fd=open(argv[1],O_RDWR|O_APPEND))==-1){
  16.         err_exit("open failed\n");
  17.    }
  18.    printf("(w)rite or (r)ead?\n");
  19.    scanf("%c",&a);
  20.    while(1){
  21.       if(a=='r'){

  22.           if((n=lseek(fd,10,SEEK_SET))==-1){
  23.                err_exit("lseek");
  24.           }
  25.           if((n=read(fd,buf,(BUFSIZ)))<0){
  26.                err_exit("wirte failed\n");
  27.           }
  28.           printf("READ FROM %s:%s.",argv[1],buf);
  29.           printf("TOTAL %d bytes\n",n);
  30.                exit(0);
  31.        }
  32.        else if(a=='w'){
  33.           if((n=lseek(fd,-10,SEEK_END))==-1){
  34.                err_exit("lseek failed\n");
  35.           }
  36.           *buf="hello";
  37.           if((n=write(fd,buf,sizeof(buf)))<0){
  38.                err_exit("wirte failed\n");
  39.           }
  40.           printf("READ FROM %s:%s.",argv[1],buf);
  41.           printf("TOTAL %d bytes\n",n);

  42.                  exit(0);
  43.        }
  44.            else{
  45.                    exit(1);
  46.            }
  47.    }
  48. }
复制代码




我建立了个temp.file文件,里面内容就是26个子母,执行read时正常
为什么执行write就是程序中的r时候会把文件变成个32795字节的文件阿!?
回复 支持 反对

使用道具 举报

发表于 2005-2-23 11:14:06 | 显示全部楼层
因为你定义的 buf 是 char * 型的数组,数组大小是BUFSIZ(即8192),char *型的大小是4,所以 sizeof(buf) = 8192 * 4 = 32768。

修改方法:sizeof(buf) 改为 strlen(buf);
buf 定义为 char *buf; 赋值为 buf = "hello";

另:你的程序中错误太多,如:
(1) buf 为什么定义为 char * 型数组?
(2) err_exit 和 printf 后面的提示信息什么时候是读,什么时候是写,非常混乱。别小看了提示信息,它可以大大减少你调试时的工作量。
程序好好改一改吧。
回复 支持 反对

使用道具 举报

发表于 2005-2-24 20:27:49 | 显示全部楼层
最大的错误是以O_APPEND方式打开文件,这种方式每次写入文件的结尾,不管当前文件位置在哪儿,
O_APPEND对读数据没有影响.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-24 20:50:37 | 显示全部楼层
Post by JBug
最大的错误是以O_APPEND方式打开文件,这种方式每次写入文件的结尾,不管当前文件位置在哪儿,
O_APPEND对读数据没有影响.

这个我知道,程序目的主要就是实验O_APPEND对于read和write的影响
回复 支持 反对

使用道具 举报

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

本版积分规则

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