原文网址:http://m.blog.csdn.net/blog/u014488381/42556509

原题:如果使用追加标志打开一个文件以便读、写,能否仍用 lseek 在任一为止开始读?能否用 lseek 更新文件中任一部分的数据?

验证程序如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <string.h>
  6.  
  7. #define BUF_SIZ 32
  8.  
  9. int main()
  10. {
  11. int fd;
  12. int res;
  13. off_t offset;
  14. char buffer[BUF_SIZ];
  15. fd = open( "test.txt", O_RDWR | O_APPEND | O_CREAT, 0666 );
  16.  
  17. //初始化打开的文件,写入字符串 Hello, Mr.Zhang.
  18. res = write( fd, "Hello, Mr.Zhang.", strlen("Hello, Mr.Zhang.") );
  19. if( -1 == res ) {
  20. perror("write failed");
  21. exit( EXIT_FAILURE );
  22. }
  23.  
  24. //从指定位置读取文件内容
  25. memset( buffer, '\0', BUF_SIZ );
  26. offset = lseek( fd, 7, SEEK_SET ); //距文件开始处偏移 7 字节
  27. if( -1 == offset ) {
  28. perror("lseek error");
  29. exit( EXIT_FAILURE );
  30. }
  31.  
  32. res = read( fd, buffer, 10 );
  33. if( -1 == res ) {
  34. perror("read error");
  35. exit( EXIT_FAILURE );
  36. }
  37. printf("read result1: %s\n", buffer);
  38.  
  39. //从指定位置向文件写入内容
  40. offset = lseek( fd, 7, SEEK_SET );
  41. if( -1 == offset ) {
  42. perror("lseek error");
  43. exit( EXIT_FAILURE );
  44. }
  45.  
  46. res = write( fd, "Dear ", strlen("Dear ") );
  47. if( -1 == res ) {
  48. perror("write failed");
  49. exit( EXIT_FAILURE );
  50. }
  51.  
  52. //从头再次读取文件的内容
  53. memset( buffer, '\0', BUF_SIZ );
  54. offset = lseek( fd, 0, SEEK_SET );
  55. if( -1 == offset ) {
  56. perror("lseek error");
  57. exit( EXIT_FAILURE );
  58. }
  59. res = read( fd, buffer, BUF_SIZ );
  60. if( -1 == res ) {
  61. perror("read failed");
  62. exit( EXIT_FAILURE );
  63. }
  64. printf("read result2: %s\n", buffer);
  65. unlink( "test.txt" );
  66. close( fd );
  67. exit( EXIT_SUCCESS );
  68. }

程序输出结果为:

[zhang@localhost APUE]$ ./lseek_test
read result1: Mr.Zhang.
read result2: Hello, Mr.Zhang.Dear

可知:

这种情况下,仍然可以用 lseek 和 read 函数读文件中任一一个位置的内容。但是 write 函数在写数据之前会自动将文件偏移量设置为文件尾,所以写文件时只能从文件尾端开始。

【转】APUE习题4.6---测试lseek作用的更多相关文章

  1. 测试MailUtils,作用是发邮件

    package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...

  2. APUE习题3.2用dup实现dup2以及shell中重定向符号的使用

    习题3.2的要求是不使用fcntl()而编写一个同dup2()功能相同的函数.直觉上是不断使用dup()直到返回指定的文件描述符. #include <stdio.h>#include & ...

  3. APUE 习题3-2 实现dup2,要求不使用fcntl函数。

    int mydup2(int oldfd, int newfd) {     int tfd = 0;     if (newfd < 0)     {         err_sys(&quo ...

  4. 【Python装饰者】在函数测试的作用

    [引言] 我们经常需要多函数进行耗时测试,测试方法有许多,这里介绍装饰者的方法,提高耗时测试代码的可复用性,在其他方面的应用也是如此. [设计原则] 类应该对扩展开放,对修改关闭. [代码] (1)定 ...

  5. APUE习题8.7

    看书的时候发现这个习题没有答案,于是就想把自己做的结果贴上来,和大家分享分享! 首先把题目贴上来吧: /*********** 8.10节中提及POSIX.1要求在调用exec时关闭打开的目录流.按下 ...

  6. APUE学习笔记(2):lseek()练习与文件洞

    对于lseek函数早在大一的C语言课上就有接触,但是几乎没有使用过,只记得是和文件偏移操作相关的 看了APUE上的示例,又使用od工具查看了内容,果然很神奇,很新鲜 figure3.2.c [c] # ...

  7. APUE习题5.x

    5.4 下面的代码在一些机器上运行正确,而在另外一些机器运行时出错,解释问题所在? #include <stdio.h> int main( void ) { char c; while( ...

  8. 函数名: lseek

    函数名: lseek 功 能: 移动文件读/写指针 头文件:#include <sys/types.h> #include <unistd.h> 用 法: off_t lsee ...

  9. lseek函数

    所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo.cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数.读写操作通常开始于 cfo,并 ...

随机推荐

  1. POJ 1775

    #include <iostream> using namespace std; ,,,,,,,,,}; bool boo; void DFS(int time,int sum); int ...

  2. LOGSTASH再入门第一发

    慢慢弄起来... 前年搞过,现在生疏了,再慢慢拾起来吧. 一些URL: https://www.elastic.co/downloads/logstash https://www.elastic.co ...

  3. linux 踢出用户方法

    linux系统root用户可强制踢制其它登录用户, 首先以root登录以便查看全部的在线用户信息,可用w命令查看登录用户信息 强制踢人命令格式:pkill -kill -t tty 解释: pkill ...

  4. vector、string实现大数加法乘法

    理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将 ...

  5. spring 与 CXF 整合 webservice 出现error “Unable to locate Spring NamespaceHandler for XML schema namespace” 总结

    我试了多个版本的spring 发现 出现error : Unable to locate Spring NamespaceHandler for XML schema namespace 并非都是sp ...

  6. mac 安装mysql 报错“ERROR 2002 (HY000): Can not connect to local MySQL server through socket '/tmp/mysql.sock' (2)” 解决办法

    首先安装 homebrew 再 brew install mysql 之后连接 mysql 无论是登录还是修改初始密码都会报如下的错误 ERROR 2002 (HY000): Can not conn ...

  7. XCODE 出现 The operation couldn't be completed.(LaunchServicesError error 0.)错误修复

    XCODE 出现 The operation couldn't be completed.(LaunchServicesError error 0.)错误修复   XCODE 出现 The opera ...

  8. 【nginx运维基础(4)】Nginx的日志管理(日志格式与定时分割日志)

    Nginx日志主要分为两种:访问日志和错误日志.日志开关在Nginx配置文件(一般在server段来配置)中设置,两种日志都可以选择性关闭,默认都是打开的. 访问日志access_log #日志格式设 ...

  9. IOS中实现图片点击全屏预览

    //// ViewController.m// XWZoomImageView//// Created by xiao on 15/11/13.// Copyright © 2015年 xiao. A ...

  10. Orcle数据库查询练习复习:三

    一.题目 1.与“张三”同乡的男生姓名 select * from student where snativeplace=(select snativeplace from student where ...