linux系统编程:read,write与lseek的综合应用,linuxlseek


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

用法:

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个字节

源代码:

1 /*================================================================ 2 * Copyright (C) 2018 . All rights reserved. 3 * 4 * 文件名称:io.c 5 * 创 建 者:ghostwu(吴华) 6 * 创建日期:2018年01月10日 7 * 描 述:write,open,lseek结合示例 8 * 9 ================================================================*/ 10 11 #include <stdio.h> 12 #include <stdlib.h> 13 #include <string.h> 14 #include <sys/types.h> 15 #include <sys/stat.h> 16 #include <fcntl.h> 17 #include <limits.h> 18 #include <sys/types.h> 19 #include <unistd.h> 20 21 //参数字符串转整数 22 int str_to_long( char* str ); 23 24 int main(int argc, char *argv[]) 25 { 26 int i = 2; 27 int fd = -1; 28 //保存字符串转整形的结果 29 int res; 30 //写入的字节数 31 ssize_t num; 32 //动态分配的堆内存 33 char* buf; 34 //读取的字节数 35 int numread; 36 37 if( argc < 3 || strcmp( argv[1], "--help" ) == 0 ) { 38 printf( "usage:%s file {r<length>|R<length>|w<string>|s<offset>}...\n", argv[0] ); 39 exit( -1 ); 40 } 41 42 fd = open( argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH ); 43 if( fd < 0 ) { 44 printf( "文件%s打开或者创建失败", argv[1] ); 45 exit( -1 ); 46 } 47 48 for( i = 2; i < argc; i++ ){ 49 switch( argv[i][0] ){ 50 //移动指针, s后面跟移动的字节数 51 case 's': 52 res = str_to_long( &argv[i][1] ); 53 if( -1 == res ) { 54 printf( "字符串->整形转换失败\n" ); 55 exit( -1 ); 56 } 57 lseek( fd, res, SEEK_CUR ); 58 printf( "%s--->指针移动成功\n", argv[i] ); 59 break; 60 //写入文件, w后面跟写入的内容 61 case 'w': 62 num = write( fd, &argv[i][1], strlen( &argv[i][1] ) ); 63 if( num == -1 ) { 64 printf( "%s写入失败\n", argv[i] ); 65 } 66 printf( "%s成功写入%ld个字节\n", argv[i], num ); 67 break; 68 case 'r': //字符输出 69 case 'R': //十六进制输出 70 res = str_to_long( &argv[i][1] ); 71 if( -1 == res ) { 72 printf( "字符串->整形转换失败\n" ); 73 exit( -1 ); 74 } 75 buf = malloc( res ); 76 if( buf == NULL ){ 77 printf( "内存分配失败" ); 78 exit( -1 ); 79 } 80 numread = read( fd, buf, res ); 81 if( -1 == numread ) { 82 printf( "数据读取失败\n" ); 83 exit( -1 ); 84 } 85 if( 0 == numread ) { 86 printf( "已经到达文件尾部" ); 87 }else { 88 printf( "%s: ", argv[i] ); 89 for ( int j = 0 ; j < numread; j ++ ){ 90 if( 'r' == argv[i][0] ) { 91 printf( "%c", buf[j] ); 92 }else { 93 printf( "%02x ", buf[j] ); 94 } 95 } 96 } 97 break; 98 default: 99 printf( "参数%s必须以[rRws]中的一个开头\n", argv[i] ); 100 } 101 } 102 103 return 0; 104 } 105 106 int str_to_long( char* str ) { 107 char* endstr; 108 int res; 109 res = strtol( str, &endstr, 10 ); 110 if( (res == LONG_MIN) || (res == LONG_MAX) ) { 111 return -1; 112 } 113 return res; 114 } View Code

完整的演示效果:

 1 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls
 2 cp  cp.c  cp.c.copy  io  io.c  strtol  strtol.c
 3 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ !g
 4 gcc io.c -o io
 5 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l
 6 total 56
 7 -rwxrwxr-x 1 ghostwu ghostwu  9016 1月  10 17:16 cp
 8 -rw-rw-r-- 1 ghostwu ghostwu  1752 1月  10 17:15 cp.c
 9 -rw-rw-r-- 1 ghostwu ghostwu  1752 1月  10 17:16 cp.c.copy
10 -rwxrwxr-x 1 ghostwu ghostwu 13360 1月  10 22:19 io
11 -rw-rw-r-- 1 ghostwu ghostwu  2743 1月  10 22:19 io.c
12 -rwxrwxr-x 1 ghostwu ghostwu  8824 1月  10 20:47 strtol
13 -rw-rw-r-- 1 ghostwu ghostwu   616 1月  10 20:47 strtol.c
14 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt
15 usage:./io file {r<length>|R<length>|w<string>|s<offset>}...
16 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l
17 total 56
18 -rwxrwxr-x 1 ghostwu ghostwu  9016 1月  10 17:16 cp
19 -rw-rw-r-- 1 ghostwu ghostwu  1752 1月  10 17:15 cp.c
20 -rw-rw-r-- 1 ghostwu ghostwu  1752 1月  10 17:16 cp.c.copy
21 -rwxrwxr-x 1 ghostwu ghostwu 13360 1月  10 22:19 io
22 -rw-rw-r-- 1 ghostwu ghostwu  2743 1月  10 22:19 io.c
23 -rwxrwxr-x 1 ghostwu ghostwu  8824 1月  10 20:47 strtol
24 -rw-rw-r-- 1 ghostwu ghostwu   616 1月  10 20:47 strtol.c
25 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 wghostwu
26 s1000--->指针移动成功
27 wghostwu成功写入7个字节
28 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l
29 total 60
30 -rwxrwxr-x 1 ghostwu ghostwu  9016 1月  10 17:16 cp
31 -rw-rw-r-- 1 ghostwu ghostwu  1752 1月  10 17:15 cp.c
32 -rw-rw-r-- 1 ghostwu ghostwu  1752 1月  10 17:16 cp.c.copy
33 -rwxrwxr-x 1 ghostwu ghostwu 13360 1月  10 22:19 io
34 -rw-rw-r-- 1 ghostwu ghostwu  2743 1月  10 22:19 io.c
35 -rwxrwxr-x 1 ghostwu ghostwu  8824 1月  10 20:47 strtol
36 -rw-rw-r-- 1 ghostwu ghostwu   616 1月  10 20:47 strtol.c
37 -rw-rw-r-- 1 ghostwu ghostwu  1007 1月  10 22:20 test.txt
38 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt r1007
39 r1007: ghostwughostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt R1007
40 R1007: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 68 6f 73 74 77 75 
41 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 r7 42 s1000--->指针移动成功 43 r7: ghostwughostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 R7 44 s1000--->指针移动成功

 

相关内容

    暂无相关文章