需求:程序的第一个命令行参数为将要打开的文件名称,余下的参数则指定了文件上执行的输入输出操作。每个表示操作的参数都以一个字母开头,紧跟以相关值(中间无空格分隔)。

soffet:从文件开始检索到offset字节位置

rlength:在文件当前偏移量处,从文件中读取length字节数据,并以文本形式显式

Rlength:在当前文件偏移量处,从文件中读取length字节数据,并以十六进制形式显式

wstr:在当前文件偏移量处,由文件写入由str指定的字符串

#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
#include "get_num.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
size_t len;
off_t offset;
int fd, ap, j;
char *buf;
ssize_t numRead, numWritten; /* usage */
if(argc < 3 || strcmp(argv[1], "--help") == 0)
printf("%s file {r<length> | R<length> | w<string> | s<offset>} ...\n",
argv[0]); /* open or create file */
fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |
S_IROTH | S_IWOTH); /* is system call success */
if(fd == -1)
printf("open file error\n"); /* biz code */
for(ap = 2; ap < argc; ap++) {
switch(argv[ap][0]) {
case 'r': /* Display bytes at current offset, as text */
case 'R': /* Display bytes at current offset, in hex */
len = getLong(&argv[ap][1], GN_ANY_BASE, argv[ap]); /* alloc buffer */
buf = malloc(len); /* is alloc success */
if(buf == NULL)
printf("malloc error\n"); numRead = read(fd, buf, len);
if(numRead == -1)
/* read fail */
printf("read\n"); /* end of file */
if(numRead == 0)
printf("%s: end-of-file\n", argv[ap]);
else {
printf("%s: ", argv[ap]);
for(j=0; j<numRead; j++)
if(argv[ap][0] == 'r')
printf("%c", isprint((unsigned char) buf[j]) ? buf[j] : '?');
else
printf("%O2x ", (unsigned int) buf[j]);
printf("\n");
} /* free memory */
free(buf);
break;
case 'w': /* Write string at current offset */
numWritten = write(fd, &argv[ap][1], strlen(&argv[ap][1]));
if(numWritten == -1)
printf("write error\n");
printf("%s: wrote %ld bytes\n", argv[ap], (long) numWritten);
break;
case 's':
offset = getLong(&argv[ap][1], GN_ANY_BASE, argv[ap]);
if(lseek(fd, offset, SEEK_SET) == -1)
printf("lseek error!\n");
printf("%s: seek successed\n", argv[ap]);
break;
default:
printf("Argument must start with [rRws]: %s\n", argv[ap]);
}
} exit(0);
}

get_num.h

#ifndef GET_NUM_H
#define GET_NUM_H #define GN_NONNEG 01 /* Value must be >= 0 */
#define GN_GT_0 02 /* Value must be > 0 */ /* By default, integers are decimal */
#define GN_ANY_BASE 0100 /* Can use any base - like strtol(3) */
#define GN_BASE_8 0200 /* Value is expressed in octal */
#define GN_BASE_16 0400 /* Value is expressed in hexadecimal */ long getLong(const char *arg, int flags, const char *name); int getInt(const char *arg, int flags, const char *name); #endif

get_num.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <errno.h>
#include "get_num.h" static void gnFail(const char *fname, const char *msg, const char *arg,
const char *name) {
fprintf(stderr, "%s error", fname); if (name != NULL)
fprintf(stderr, " (in %s)", name); fprintf(stderr, ": %s\n", name); if(arg != NULL && *arg != '\0')
fprintf(stderr, " offending text: %s\n", arg); exit(EXIT_FAILURE);
} static long getNum(const char *fname, const char *arg, int flags,
const char *name)
{
long res;
char *endptr;
int base; if(arg == NULL || *arg == '\0')
gnFail(fname, "null or empty string", arg, name); base = (flags & GN_ANY_BASE) ? 0 : (flags & GN_BASE_8) ? 8 :
(flags & GN_BASE_16) ? 16 : 10; errno = 0; res = strtol(arg, &endptr, base); if(errno != 0)
gnFail(fname, "strtol() failed", arg, name); if(*endptr != '\0')
gnFail(fname, "nonnumeric characters", arg, name); if((flags & GN_NONNEG) && res < 0)
gnFail(fname, "negative value not allowed", arg, name); if((flags & GN_GT_0) && res <= 0)
gnFail(fname, "value must be > 0", arg, name); return res;
} long getLong(const char *arg, int flags, const char *name)
{
return getNum("getLong", arg, flags, name);
} int getInt(const char *arg, int flags, const char *name)
{
long res; res = getNum("getInt", arg, flags, name);
if(res > INT_MAX || res < INT_MIN)
gnFail("getInt", "integer out of range", arg, name); return (int) res;
}

Unix系统编程()open,read,write和lseek的综合练习的更多相关文章

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

    这个实例根据命令行参数进行相应的读学操作: 用法: usage:./io file {r<length>|R<length>|w<string>|s<offs ...

  2. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  3. 《Linux/Unix系统编程手册》读书笔记1

    <Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...

  4. 《Linux/Unix系统编程手册》读书笔记2

    <Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...

  5. 《Linux/Unix系统编程手册》读书笔记 目录

    <Linux/Unix系统编程手册>读书笔记1  (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2  (创建于4月9日,最后更新4月10日) ...

  6. 《Linux/Unix系统编程手册》读书笔记9(文件属性)

    <Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...

  7. 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

    <Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...

  8. 《Linux/Unix系统编程手册》读书笔记6

    <Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组 ...

  9. 《Linux/Unix系统编程手册》读书笔记5

    <Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...

  10. 《Linux/Unix系统编程手册》读书笔记4

    <Linux/Unix系统编程手册>读书笔记 目录 第7章: 内存分配 通过增加堆的大小分配内存,通过提升program break位置的高度来分配内存. 基本学过C语言的都用过mallo ...

随机推荐

  1. mysql之事件的开启和调用

    1.检测事件是否开启 mysql> show variables like 'event_scheduler';+-----------------+-------+| Variable_nam ...

  2. RenderMonkey 练习 第四天 【OpenGL Texture Bump】

    BumpTexture 1. 新建一个OpenGL 空effect; 2. 添加相关变量 右击Effect节点选择Add Variable->float->float / float3 添 ...

  3. 解决phpcms使用php7.1.9时修改后台菜单错误 "[] operator not supported for strings"错误提示

    出现这个错误提示是因为 $array 在初始化的时候是一个字符串,在下面使用的时候作为数组使用,php7.x版本并没有将$array自动转换为 数组而是以字符串存在"[]"作为了运 ...

  4. 开源 SHOPNC B2B2C结算营运版 wap IM客服 API 手机app 短信通知

    源码我们这里简单的测试了下,具体的请自行下载测试.这套源码官方售价很高,在这里完全免费分享,无任何限制,安装也简单. 源码下载后请自行检测安全,在使用过程中发生的任何问题请自行处理,本站不承担任何责任 ...

  5. Solidworks如何让齿轮运动副保证持续啮合状态

    出现这种情况一般是齿轮的比例有问题,如果你选择两个齿轮的齿顶圆的面,则自动比例是44:74,然后手动转动某个齿轮,就会出现不能啮合的情况   只要模数相同的齿轮不管大小都能始终啮合,但是你需要首先为每 ...

  6. 让Vs2013 完美支持EF6.1 Code First with Oracle 2015年12月24日更新

    本文是对下文的补充,切勿以为我是全盘复制哦 连接: http://www.cnblogs.com/wlflovenet/p/4187455.html Normal 0 7.8 磅 0 2 false ...

  7. python中好用的pip

    1.windows/linux 下安装pip见上篇博客 http://www.cnblogs.com/Edwardzhao/p/5856924.html 2.好用的方法 pip install xxx ...

  8. HTTP缓存策略 304

    1.图解缓存 示例: 200 (from disk cache): 200 (from memory cache) MemoryCache顾名思义,就是将资源缓存到内存中,等待下次访问时不需要重新下载 ...

  9. Unity 背包道具搜索

    因为背包有很多道具,用户要根据不同需要搜索出不同的道具.  道具的属性有非常居多,游戏快开发完毕的时候,突然发现ItemManager类里面几乎每一个搜索方法都有一个foreach循环, 循环里面因为 ...

  10. 关于ThreadLocal变量的一个坑

    每个线程都有一个ThreadLocalMap对象,ThreadLocalMap是Thread的一个内部类,可以把ThreadLocalMap理解成一个Map,这个Map里存放这一个Thread的所有线 ...