这个实例根据命令行参数进行相应的读学操作:

用法:

usage:./io file {r<length>|R<length>|w<string>|s<offset>}...

file参数:文件名, 如果不存在会自动创建

r<length>:  如r5,   r: 读取操作,表示在当前文件指针后面读取5个字节的内容,以文本形式输出.

R<length>:如R5   R:读取操作,表示在当前文件指针后面读取5个字节的内容,以十六进制形式输出.

w<string>: 如wghostwu:  w表示写入操作,表示在当前文件指针后面写入5个字节的内容

s<offset>: 如s1000, 从文件开头把指针移动1000个字节

源代码:

 /*================================================================
* Copyright (C) 2018 . All rights reserved.
*
* 文件名称:io.c
* 创 建 者:ghostwu(吴华)
* 创建日期:2018年01月10日
* 描 述:write,open,lseek结合示例
*
================================================================*/ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <unistd.h> //参数字符串转整数
int str_to_long( char* str ); int main(int argc, char *argv[])
{
int i = ;
int fd = -;
//保存字符串转整形的结果
int res;
//写入的字节数
ssize_t num;
//动态分配的堆内存
char* buf;
//读取的字节数
int numread; if( argc < || strcmp( argv[], "--help" ) == ) {
printf( "usage:%s file {r<length>|R<length>|w<string>|s<offset>}...\n", argv[] );
exit( - );
} fd = open( argv[], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH );
if( fd < ) {
printf( "文件%s打开或者创建失败", argv[] );
exit( - );
} for( i = ; i < argc; i++ ){
switch( argv[i][] ){
//移动指针, s后面跟移动的字节数
case 's':
res = str_to_long( &argv[i][] );
if( - == res ) {
printf( "字符串->整形转换失败\n" );
exit( - );
}
lseek( fd, res, SEEK_CUR );
printf( "%s--->指针移动成功\n", argv[i] );
break;
//写入文件, w后面跟写入的内容
case 'w':
num = write( fd, &argv[i][], strlen( &argv[i][] ) );
if( num == - ) {
printf( "%s写入失败\n", argv[i] );
}
printf( "%s成功写入%ld个字节\n", argv[i], num );
break;
case 'r': //字符输出
case 'R': //十六进制输出
res = str_to_long( &argv[i][] );
if( - == res ) {
printf( "字符串->整形转换失败\n" );
exit( - );
}
buf = malloc( res );
if( buf == NULL ){
printf( "内存分配失败" );
exit( - );
}
numread = read( fd, buf, res );
if( - == numread ) {
printf( "数据读取失败\n" );
exit( - );
}
if( == numread ) {
printf( "已经到达文件尾部" );
}else {
printf( "%s: ", argv[i] );
for ( int j = ; j < numread; j ++ ){
if( 'r' == argv[i][] ) {
printf( "%c", buf[j] );
}else {
printf( "%02x ", buf[j] );
}
}
}
break;
default:
printf( "参数%s必须以[rRws]中的一个开头\n", argv[i] );
}
} return ;
} int str_to_long( char* str ) {
char* endstr;
int res;
res = strtol( str, &endstr, );
if( (res == LONG_MIN) || (res == LONG_MAX) ) {
return -;
}
return res;
}

完整的演示效果:

 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls
cp cp.c cp.c.copy io io.c strtol strtol.c
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ !g
gcc io.c -o io
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l
total
-rwxrwxr-x ghostwu ghostwu 1月 : cp
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c.copy
-rwxrwxr-x ghostwu ghostwu 1月 : io
-rw-rw-r-- ghostwu ghostwu 1月 : io.c
-rwxrwxr-x ghostwu ghostwu 1月 : strtol
-rw-rw-r-- ghostwu ghostwu 1月 : strtol.c
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt
usage:./io file {r<length>|R<length>|w<string>|s<offset>}...
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l
total
-rwxrwxr-x ghostwu ghostwu 1月 : cp
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c.copy
-rwxrwxr-x ghostwu ghostwu 1月 : io
-rw-rw-r-- ghostwu ghostwu 1月 : io.c
-rwxrwxr-x ghostwu ghostwu 1月 : strtol
-rw-rw-r-- ghostwu ghostwu 1月 : strtol.c
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 wghostwu
s1000--->指针移动成功
wghostwu成功写入7个字节
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l
total
-rwxrwxr-x ghostwu ghostwu 1月 : cp
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c.copy
-rwxrwxr-x ghostwu ghostwu 1月 : io
-rw-rw-r-- ghostwu ghostwu 1月 : io.c
-rwxrwxr-x ghostwu ghostwu 1月 : strtol
-rw-rw-r-- ghostwu ghostwu 1月 : strtol.c
-rw-rw-r-- ghostwu ghostwu 1月 : test.txt
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt r1007
r1007: ghostwughostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt R1007
R1007: 6f
41 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 r7
s1000--->指针移动成功
r7: ghostwughostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 R7
s1000--->指针移动成功

linux系统编程:read,write与lseek的综合应用的更多相关文章

  1. linux系统编程之管道(三)

    今天继续研究管道的内容,这次主要是研究一下命名管道,以及与之前学过的匿名管道的区别,话不多说,进入正题: 所以说,我们要知道命名管道的作用,可以进行毫无关系的两个进程间进行通讯,这是匿名管道所无法实现 ...

  2. Linux系统编程@进程通信(一)

    进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...

  3. Linux 系统编程

    简介和主要概念 Linux 系统编程最突出的特点是要求系统程序员对它们工作的的系统的硬件和操作系统有深入和全面的了解,当然它们还有库和系统调用上的区别. 系统编程分为:驱动编程.用户空间编程和网络编程 ...

  4. Linux C 程序 文件操作(Linux系统编程)(14)

    文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...

  5. 读书笔记之Linux系统编程与深入理解Linux内核

    前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...

  6. Linux系统编程【转】

    转自:https://blog.csdn.net/majiakun1/article/details/8558308 一.Linux系统编程概论 1.1 系统编程基石 syscall: libc:标准 ...

  7. 《Linux系统编程(第2版)》

    <Linux系统编程(第2版)> 基本信息 作者: (美)Robert Love 译者: 祝洪凯 李妹芳 付途 出版社:人民邮电出版社 ISBN:9787115346353 上架时间:20 ...

  8. linux系统编程(一)概述

    glibc库封装了linux系统调用,并提供c语言接口 所以学习linux系统编程,主要参考glibc库系统调用相关api 一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 ...

  9. Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道

    Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道 背景 上一讲我们介绍了创建子进程的方式.我们都知道,创建子进程是为了与父进程协作(或者是为了执行新的程序,参考 Linux ...

  10. Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号

    Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...

随机推荐

  1. CentOS 7修改yum源为阿里源

    1.备份本地源 1 # mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak 2.获取阿里yum源配置 ...

  2. 详述MSSQL服务在渗透测试中的利用 (下篇)

    part3 MSSQL写文件 步骤1 sp_makewebtask写文件 因为是`SA`权限,如果目标服务器是web服务器,我们也不用去备份了,可以直接写个一句话木马进去到web目录. 在不知道web ...

  3. vue+iview实现一行平均五列布局

    iview 的栅格布局是以 html代码部分: <Row :gutter="20"> <Col style="float: left;width: 20 ...

  4. [Leetcode]120.三角形路径最小和

    ---恢复内容开始--- 题目的链接 简单的动态规划题,使用了二维dp数组就能很好的表示. 由于有边界的问题,所以这个dp数组为 dp[n+1][n+1]. dp[i][j]意思是终点为(i-1,j- ...

  5. C#枚举中使用Flags特性

    .NET中的枚举我们一般有两种用法,一是表示唯一的元素序列:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,这样我们就可以用"或"运算符组合 ...

  6. odoo开发笔记:Server+Action服务器动作自动触发执行

           Odoo的市场定位是SME(中小型企业),这个市场的ERP产品,多如牛毛,产品各具特色.不过,Odoo的自动化处理机制,可以睥睨天下,无人能及.包括一些大型国产软件,如用友.金蝶也不具备 ...

  7. 剑指offer九之变态跳台阶

    一.题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 二.思路 1.关于本题,前提是n个台阶会有一次n阶的跳法.分析如下: f(1) ...

  8. Storm官方提供的trident单词计数的例子

    上代码: public class TridentWordCount { public static class Split extends BaseFunction { @Override publ ...

  9. Firefox火狐 浏览器接口调试工具 JSON 格式化

    作为一名“IT界”的淫才,还是主攻Web端的淫才,相信大家经常会联调各种接口! 如今APP猖狂的年代接口联调更为频繁,当然我们常用于Firefox火狐 浏览器,所以这里主要讲Firefox火狐 浏览器 ...

  10. Git for Windows之基础环境搭建与基础操作

    一.安装Git工具 下载地址:Git For Windows 下载完后,安装,全程Next. 二.全局配置 1.配置本地用户名,用于提交代码 2.配置邮箱 三.创建本地Git项目仓库 1.建立代码仓库 ...