【APUE】文件 I/O 操作(二)

简介: 【APUE】文件 I/O 操作(二)

4. 函数综合示例





/*************************************************************************
    > File Name: fun_read.c
    > Author: octopus
    > Mail: octopus_truth.163.com 
    > Created Time: 一  7/27 07:09:36 2015
 ************************************************************************/
#include <stdio.h>
#include <sys/types.h>    // ... read() 头文件
#include <sys/uio.h>    // ... read() 头文件
#include <unistd.h>    // ... read() write() 函数头文件
#include <stdarg.h>    // va_list 可变参数操作头文件
#include <string.h>    // strlen strcat 方法的头文件
#include <errno.h>    // errno 的头文件
#include <stdlib.h>    // exit() 方法的头文件
#include <fcntl.h>    // open() 函数的头文件
#define MAXLINE 4096
#define MAXWORD 20
void err_sys(const char *fmt, ...);
int main(int argc, char * argv[])
{
  char *buf = "abcdefg\n";
  char buf_read[MAXWORD];
  int fd;
  int creat_result;
  int write_size;
  int close_result;
  int read_size;
  //创建一个文件, 使用打开方式, 如果文件不存在, 就重创建并打开
  if( ( fd = open("file_read_write.file", O_WRONLY | O_CREAT | O_TRUNC) ) == -1)
  err_sys("创建文件出错");
  //向文件中写出数据
  if( (write_size = write(fd, buf, strlen(buf))) == -1)
  err_sys("向文件写出数据出错");
  if( (close_result = close(fd)) == -1)
  err_sys("关闭文件出错");
  if( (fd = open("file_read_write.file", O_RDONLY)) == -1)
  err_sys("打开文件出错");
  //从文件中读取文件内容
  if( (read_size = read(fd, buf_read, strlen(buf)) ) == -1)
  err_sys("读取文件出错");
  if( (close_result = close(fd)) == -1)
  err_sys("关闭文件出错");
  printf("文件中得内容 : %s \n", buf_read);
}
static void err_doit(int errnoflag, int error, const char* fmt, va_list ap)
{
  char buf[MAXLINE];
  //将 ap 可变参数使用 fmt 格式, 放置 MAXLINE 个字符到 buf 缓冲中
  vsnprintf(buf, MAXLINE, fmt, ap);
  /*
  * 如果需要错误信息, 根据错误号获取标准错误信息, 将该信息添加到 buf 缓冲中
  * strlen 作用 : 获取字符串长度
  * strerror 作用 : 根据错误号获取错误信息
  */
  if(errnoflag)
  snprintf(buf + strlen(buf), MAXLINE - strlen(buf), ": %s", strerror(errno));
  //在 buf 字符串后添加换行符号
  strcat(buf, "\n");
  //刷新标准输出流
  fflush(stdout);
  //将标准错误输出添加到 buf 缓冲区中
  fputs(buf, stderr);
  //刷新所有缓冲区
  fflush(NULL);
}
void err_sys(const char *fmt, ...)
{
  va_list ap;
  va_start(ap, fmt);
  err_doit(1, errno, fmt, ap);
  va_end(ap);
  exit(0);
}


执行结果 :


octopus-2:file octopus$ ls
fun_lseek.c  fun_lseek_hole.c fun_read_write.c
octopus-2:file octopus$ gcc fun_read_write.c 
octopus-2:file octopus$ sudo ./a.out 
Password:

文件中得内容 : abcdefg


         








四. 文件读写原子操作相关函数介绍






1. pread 函数






pread 函数 :


-- 1. 函数内容 :



#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t count, off_t offset);

-- 2. 函数作用 : 读取文件描述符 fd 对应的文件, 返回读取到的文件字节个数, 读取到文件结尾 返回 0, 出现错误返回 -1;


-- 3. 函数返回值 : 返回读取文件的字节数, 读取到结尾返回 0, 出错返回 -1;




pread 与 read 方法作用 :


-- 1. 等价执行流程 : pread 方法等价于 先调用 lseek 方法,  再调用 read 方法;


-- 2. 与等价流程的区别 : ① 执行 pread 方法时, 先定位 后 读取 的两个操作, 不能中断; ② 文件指针 不更新;







2. pwrite 函数




pwrite 函数 :


-- 1. 函数内容 :



 

#include <unistd.h>
       ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);



-- 2. 函数作用 : 写出数据到指定的位置;


-- 3. 函数返回值 : 返回写出的字节数, 出现错误返回 -1;


-- 4. 等价操作 : pwrite 等价于 lseek 和 write 操作;















3. pread 和 pwrite 函数示例






函数示例过程 :


-- 1. 打开文件, 如果没有就创建;


-- 2. 写出 a ~ z 26个子母;


-- 3. 读取文件 10 ~ 15 个字节;


-- 4. 向第 10 个字节处写出 "00000" 字符串;




函数示例 :


-- 代码 :



#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char **argv)
{
  printf("main : \n");
  int file_fd, write_result;
  char * buffer = "abcdefghigklmnopqrstuvwxyz";
  file_fd = open("5.pread_write.txt", O_RDWR | O_APPEND | O_CREAT);
  printf("file_fd = %d\n", file_fd);
  write_result = write(file_fd, buffer, strlen(buffer));
  printf("write success, count = %d\n", write_result);
  return 0;
}



.


目录
相关文章
|
5天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
305 116
|
20天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
7天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
503 45
Meta SAM3开源:让图像分割,听懂你的话
|
14天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
695 222
|
2天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
135 95
|
12天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1711 158
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
953 62