文件的写入 和 读取

文件的写入

需要包含的头文件

 #include <unistd.h>

相关的API函数

ssize_t write(int fd, const void *buf, size_t count);

参数说明

  • int fd :文件描述符
  • const void *buf :一个无类型的指针buf,是一个缓冲区
  • size_t count:要写入文件的大小

可以理解为write函数就是将count大小的数据,从buf缓冲区写到fd对应的文件里去

  • 返回值:成功则返回 写入的字节数,失败则返回 -1

实操演示

1. 将上节的demo1.c 复制一份并重命名为 demo2.c:

2. 同样使用man函数来查看write函数相关信息:(man 2 write)

3. 在demo2.c中修改代码并保存退出:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>int main()
{int fd; // file descriptionchar *buf = "mjmmjm";fd = open("./file1",O_RDWR|O_CREAT, 0600);printf("file description = %d, open successfully!\n",fd);write(fd, buf, strlen(buf)); //对于字符串常量来说,使用sizeof求出的是系统用多少字节表示一个字符型指针,必须使用strlen才可以表示字符串的有效长度close(fd); //close after writing return 0;
}

注释中提到过,这里再强调一下:

对于字符串常量来说,使用sizeof求出的是系统用多少字节表示一个字符型指针,必须使用strlen才可以表示字符串的有效长度

详见:C语言的字符串_mjmmm的博客-CSDN博客

4. 运行程序,并查看file1:

可见,成功写入!

 

文件的读取

需要包含的头文件

 #include <unistd.h>

相关的API函数

ssize_t read(int fd, void *buf, size_t count);

参数说明

  • int fd :文件描述符
  • const void *buf :一个无类型的指针buf,是一个缓冲区
  • size_t count:要读取文件的大小

可以理解为read函数就是从fd对应的文件中,读取count大小的数据放到buf缓冲区

  • 返回值:成功则返回 读取到的字节数,失败则返回 -1

这里涉及到一个从哪里开始读的问题,答案是从光标处开始读

实操演示

1. 将demo2.c 复制一份并重命名为 demo3.c:

2.  同样可以使用 man 2 read:

3. 在demo3.c中修改代码并保存退出:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main()
{int fd; // file descriptionchar *buf = "mjmmjm";char *buf_read;fd = open("./file1",O_RDWR|O_CREAT, 0600);printf("file description = %d, open successfully!\n",fd);int count_write = write(fd, buf, strlen(buf));if(count_write != -1){printf("%d bytes data has been written",count_write);buf_read = (char *)malloc(sizeof(char)*count_write + 1); //为野指针开辟空间防止段错误,且由于malloc返回值是void类型的指针,所以需要强制类型转换成char类型的指针}else{printf("fail to write");exit(-1);}int count_read = read(fd, buf_read, count);if(count_read != -1){printf("%d bytes data has been read, context:%s\n",count_read, buf_read);}else{printf("fail to read");}close(fd); //close after reading return 0;
}

4. 删除file1(避免之前写入过,导致结果不准确),并运行代码:

可见,虽然代码的逻辑似乎没有问题,但是却一个字节都没有读到,原因就是刚刚提到的,读取文件存在一个“从哪里开始读”的问题,而由于刚刚对文件进行write操作之后,光标处于文件的末尾,所以从此时如果从光标处read,注定是无法读到任何信息的。

解决这个问题的方法有两种:

  • 将光标移到头再读
  • 将文件重新打开

5. 完善代码:

使用“重新打开文件”的方法解决问题:

这种方式比较好实现,但是效率不高而且思路有些反人类

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main()
{int fd; // file descriptionchar *buf = "mjmmjm";char *buf_read;fd = open("./file1",O_RDWR|O_CREAT, 0600);printf("file description = %d, open successfully!\n",fd);int count_write = write(fd, buf, strlen(buf));if(count_write != -1){printf("%d bytes data has been written\n",count_write);buf_read = (char *)malloc(sizeof(char)*count_write + 1);}else{printf("fail to write\n");exit(-1);}close(fd); //关闭文件fd = open("./file1",O_RDWR, 0600); //重新打开文件int count_read = read(fd, buf_read, count_write);if(count_read != -1){printf("%d bytes data has been read, context:%s\n",count_read, buf_read);}else{printf("fail to read\n");}close(fd); //close after reading return 0;
}

实现效果:

 

使用“移动光标”的方法解决问题:

关于光标的控制:

需要包含的头文件

#include <sys/types.h>
#include <unistd.h>

相关的API函数

off_t lseek(int fd, off_t offset, int whence);

参数说明

  • int fd :文件描述符
  • off_t offset:偏移多少个字节
  • int whence:光标偏移位置

其中whence可以设置为 以下3个值中的一个

  • SEEK_SET:文件开头
  • SEEK_CUR:光标当前位置
  • SEEK_END:文件尾

可以理解为lseek函数就是将光标移到whence+offset的位置

  • 返回值:成功则 返回从文件开始的偏移了多少字节;发生错误时,返回 -1
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main()
{int fd; // file descriptionchar *buf = "mjmmjm";char *buf_read;fd = open("./file1",O_RDWR|O_CREAT, 0600);printf("file description = %d, open successfully!\n",fd);int count_write = write(fd, buf, strlen(buf));if(count_write != -1){printf("%d bytes data has been written\n",count_write);buf_read = (char *)malloc(sizeof(char)*count_write + 1);}else{printf("fail to write\n");exit(-1);}lseek(fd, 0, SEEK_SET); //将光标移到最开头int count_read = read(fd, buf_read, count_write);if(count_read != -1){printf("%d bytes data has been read, context:%s\n",count_read, buf_read);}else{printf("fail to read\n");}close(fd); //close after reading return 0;
}

实现效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/21062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

22.Netty源码之解码器

highlight: arduino-light 抽象解码类 https://mp.weixin.qq.com/s/526p5f9fgtZu7yYq5j7LiQ 解码器 Netty 常用解码器类型&#xff1a; ByteToMessageDecoder/ReplayingDecoder 将字节流解码为消息对象&#xff1b;MessageToMessageDecoder 将一种消息类型解码为另外一种消息类…

Pytorch深度学习-----神经网络之Sequential的详细使用及实战详解

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

1376:信使(msner)---信息学奥赛一本通

【题目描述】 战争时期&#xff0c;前线有n个哨所&#xff0c;每个哨所可能会与其他若干个哨所之间有通信联系。信使负责在哨所之间传递信息&#xff0c;当然&#xff0c;这是要花费一定时间的&#xff08;以天为单位&#xff09;。指挥部设在第一个哨所。当指挥部下达一个命令…

HOT71-字符串解码

leetcode原题链接: 字符串解码 题目描述 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的&#xff1b;输…

mybatis框架异常org.apache.ibatis.exceptions.PersistenceException

错误复现 &#xff1a; postman调接口的时候出现了这样的错误&#xff1a; ex org.apache.ibatis.exceptions.PersistenceException 报错原因&#xff1a; 出现这个org.apache.ibatis.exceptions.PersistenceException问题大多数都是找不到映射文件&#xff0c;这和没有遵…

C++游戏服务器框架笔记(五)_封装Epoll

C游戏服务器框架笔记(一)_封装数据包类 C游戏服务器框架笔记(二)_封装Socket类 C游戏服务器框架笔记(三)_封装ByteBuffer类 C游戏服务器框架笔记(四)_封装Select C游戏服务器框架笔记(五)_封装Epoll类 在上一文中已经介绍了&#xff0c;为了将Windows下的select()和linux下…

数据结构——单链表OJ题(第二弹)

单链表OJ题 前言一、返回链表开始入环的第一个节点思路一思路二 二、返回链表的深度拷贝总结 前言 此次练习题有两道&#xff01; 有点小难度&#xff0c;但相信难不住大家的&#xff01; 我也会给出两道OJ题的链接&#xff0c;大家也赶快去试一试吧 一、返回链表开始入环的第…

实验3-11 计算油费 (15 分)

实验3-11 计算油费 &#xff08;15 分&#xff09; 现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客&#xff0c;某自动加油站推出了“自助服务”和“协助服务”两个服务等级&#xff0c;分别可得到5%和3%的折扣。 本题要求编写程序&#xff0c;根据…

【网络基础进阶之路】基于MGRE多点协议的实战详解

PS&#xff1a;本要求基于华为的eNSP模拟软件进行 具体要求&#xff1a; 完成步骤&#xff1a; 1、根据上述要求&#xff0c;对各路由器进行地址安排&#xff0c;如下图。 2、进入各路由器&#xff0c;对每个端口进行地址设置。 R1路由器设置&#xff1a; ISP路由器设置&…

Go如何构建高效API接口| 青训营

Go语言作为一个高效的静态类型语言&#xff0c;在构建API服务时也表现出了很大的优势。本文将介绍如何使用Go语言构建高效的API服务&#xff0c;帮助开发者更好地应对日益增长的API需求。 一、选择适合的框架 首先&#xff0c;选择适合的框架是构建高效API服务的重要一步。在…

淘宝资源采集(从零开始学习淘宝数据爬取)

1. 为什么要进行淘宝数据爬取&#xff1f; 淘宝数据爬取是指通过自动化程序从淘宝网站上获取数据的过程。这些数据可以包括商品信息、销售数据、评论等等。淘宝数据爬取可以帮助您了解市场趋势、优化您的产品选择以及提高销售额。 淘宝作为全球的电商平台&#xff0c;每天都有…

flutter:占位视图(骨架屏、shimmer)

前言 有时候打开美团&#xff0c;在刚加载数据时会显示一个占位视图&#xff0c;如下&#xff1a; 那么这个是如何实现的呢&#xff1f;我们可以使用shimmer来开发该功能 实现 官方文档 https://pub-web.flutter-io.cn/packages/shimmer 安装 flutter pub add shimmer示例…

2023年08月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年08月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

使用Vscode编辑keil工程

一、需要安装的插件 1. Keil Assistant 2. C/C 3. 中文配置&#xff1a; 二、插件配置 1. Keil Assistant 添加Keil的安装路径 接下来就可以使用vscode编辑Keil的工程了&#xff0c;调试编译和下载程序需要返回到Keil中进行操作。 三、Vscode常用快捷键 可以自定义进行配置…

【雷达通信】非相干多视处理(CSA)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

echarts绘制关系图

效果图&#xff1a; 代码&#xff1a; <template><div id"serveGraph" style"height: 100%; width: 100%; z-index: 88;"></div> </template> <script> import { defineComponent,reactive,toRefs,onMounted,watch } from …

MFC、Qt、WPF?该用哪个?

MFC、Qt和WPF都是流行的框架和工具&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;应用程序。选择哪个框架取决于你的具体需求和偏好。MFC&#xff08;Microsoft Foundation Class&#xff09;是微软提供的框架&#xff0c;使用C编写&#xff0c;主要用于Windows…

Vue2:基础入门

Vue2&#xff1a;基础入门1 Date: April 10, 2023 Sum: vue简介、vue的基本使用、vue的指令、修饰符、过滤器&#xff08;废&#xff09;、小黑的书架、记事本 Tags: * 目标&#xff1a; 能够知道 vue 的基本使用步骤 掌握插值表达式和 v-bind 指令的用法 能够掌握如何使用…

贪心算法求解背包问题

贪心算法&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;算法得到的是在某种意义上的局部最优解 。 解题的一般步骤是&#xff1a; 1.建立数学模型来描述问题&#xff1b; 2.把求解的问题分成…

vue+ts 错误随笔

笔记 问题Parameter ‘xxx’ implicitly has an ‘any’ type的解决ts ref定义数组&#xff0c;数组遍历报错>类型“never”上不存在属性“xx”ts项目computed定义数据Getting a value from the props in root scope of <script setup> will cause the value to lose …