Day4. 文件IO的基本概念和读写

温习:

文件的拷贝(单个字符)(fgetc/fputc)

#include <stdio.h>int main(void)
{FILE* fp = NULL;FILE* fq = NULL;char ch  = 0;fp = fopen("str.txt","r");if (fp == NULL){perror("file to fopen!");return -1;}fq = fopen("add.txt","w");if (fq == NULL){perror("file to fopen!");return -1;}while(1){ch = fgetc(fp);if (EOF == ch){break;}fputc(ch,fq);}fclose(fp);fclose(fq);return 0;
}

文件的拷贝(字符串)(fgets/fputs)

#include <stdio.h>int main(void)
{FILE* fstr = NULL;FILE* fadd = NULL;char teydefe[4096] = {0};char* ret = NULL;fstr = fopen("str.txt","r");if (fstr == NULL){perror("fils to fopen!");return -1;}fadd = fopen("add.txt","w");if (fadd == NULL){perror("fils to fopen!");return -1;}while(1){ret = fgets(teydefe,sizeof(teydefe),fstr);if (ret == NULL){break;}fputs(teydefe,fadd);}fclose(fstr);fclose(fadd);return 0;
}

文件IO

一、标准IO和文件IO的区别

1.标准IO是库函数,是对系统调用的封装

2.文件IO是系统调用,是linux内核中函数的接口

3.标准IO是有缓存的

4.文件IO是没有缓存的

二、文件IO

1.操作步骤:

  打开->读/写->关闭

2.打开文件:

  open

  int open(const char *pathname,int flags);

  int open(const char *pathname,int flags,mode_t mode);

功能:

  打开文件并且获得文件描述符

参数:

  pathname:要打开的文件名

  flags:标志位

返回值:

  成功返回文件描述符(很小的非负整数)

  失败返回-1

  新生成的文件描述符总是为尚未被使用的最小非负整数

3.关闭文件:

close

  int close(int fd)

功能:

  将fd对应的文件描述符关闭

三、文件IO的打开方式和标准IO的对应关系

“r”          O_RDONLY

“r+”        O_RDWR

“w”         O_WRONLY | O_CREAT | O_TRUNC, 0664

“w+”       O_RDWR | O_CREAT | O_TRUNC, 0664

“a”         O_RDONLY | O_CREAT | O_APPEND,0664

“a+”       O_RDWR | O_CREAT | O_APPEND,0664

四、文件描述符概念

英文:缩写fd(file descripotor)

是0-1023的数字,表示文件

0、1、2的含义

0:stdin  标准输入

1:stdout  标准输出

2:stderr  错误

五、读写read/write:

1.write

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

功能:

  向fd对应的文件中写入buf指向的count个字节

参数:

  fd:文件描述符

  buf:写入数据空间首地址

  count:写入的字节数

返回值:

  成功返回实际写入字节数

  失败返回-1 

练习:

将指定文件中写入buf指向的count个字节

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>int main(void)
{int fd = 0;char tmpbuff[4069] = {"how are you!"};fd = open("a.txt",O_WRONLY | O_CREAT | O_TRUNC, 0664);if (fd == -1){perror("fail to open!");return -1;}write(fd,tmpbuff,strlen(tmpbuff));close(fd);return 0;
}

易错点:

求字符串长度用sizeof,对二进制数据使用strlen;printf的字符最后没有‘\0’

2.read 

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

功能:

  从文件描述符fd对应的文件中读取count个字节存放到buf开始的空间中

参数:

  fd:文件描述符 

  buf:存放数据空间的首地址

  count:想要读取数据字节数

返回值:   

  成功返回实际读到的字节数

  失败返回-1 

  读到文件末尾返回0 

练习:
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>int main(void)
{int fd = 0;ssize_t count = 0;char tmpbuff[4069] = {0};fd = open("a.txt",O_RDWR);if (fd == -1){perror("fail to open!");return -1;}count = read(fd,tmpbuff,sizeof(tmpbuff));printf("count=%ld\n",count);printf("tmpbuff=%s",tmpbuff);close(fd);return 0;
}

注意:源文件中会自带一个'\n',所以打印不同加'\n'

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

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

相关文章

Vue+SpringBoot打造生活废品回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨在鼓…

软件实例分享,家具生产出库管理系统软件教程

软件实例分享&#xff0c;家具生产出库管理系统软件教程 一、前言 以下软件程序教程以 佳易王家具行业生产出库管理系统软件V16.1为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 销售管理——产品状态查询变更&#xff0c;可以根据生产进度变更…

keep-alive 的简单使用

vue-router 的嵌套与模块化 router 实例中增加 children 属性&#xff0c;形成层级效果。App.vue 中的 router-view 承载的是 router 实例最外层的路由对象&#xff0c;如 /login、/404 等PageHome.vue 中的 router-view 承载的是 children 中的路由对象&#xff0c;如 /home、…

洛谷P1177 排序 题解

#题外话&#xff08;第30篇题解&#xff09;&#xff08;本题为普及-难度&#xff09;&#xff08;万里挑一-不当人做法&#xff09; #先看题目 题目链接https://www.luogu.com.cn/problem/P1177 #思路&#xff08;我打算不当人&#xff09;&#xff08;本题解仅为交流探讨sor…

Python第十七章(面向对象总结)

一。面向对象三大特征 1.封装&#xff1a;将属性和方法写到类里面&#xff0c;且可以添加私有属性和方法 2.继承&#xff1a;子类默认继承父类的所有属性和方法&#xff0c;子类可以重写父类的属性和方法 3.多态&#xff1a;传入不同的对象&#xff0c;产生不同的结果 二。多…

CentOS 7.9如何禁止内核自动更新升级

要在 CentOS 7.9 系统中禁止内核自动更新&#xff0c;你可以通过配置 YUM&#xff08;Yellowdog Updater, Modified&#xff09;来实现。这里有几种方法可以阻止内核自动更新&#xff1a; 方法 1: 使用 exclude 选项在 YUM 配置中 编辑 YUM 的配置文件 /etc/yum.conf&#xff…

记一个js原生 日期 时间 处理 格式化 对象 Intl 方法

具体对应搜搜。听说用空格分开能增加关键词搜到的概率 说起来最近好像越来越懒了

【测试运维】性能测试经验文档总结第3篇:VuGen详解(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论性能测试相关知识。入门阶段&#xff1a;认识性能测试分类-(负载测试、压力测试、并发测试、稳定性测试)&#xff0c;常用性能测试指标-(吞吐量、并发数、响应时间、点击数...)&#xff0c;性能测试工具选择。性能脚本&…

Aster实现一台电脑当两台使——副屏使用独立win账号

前言&#xff1a;笔者每年回家&#xff0c;都面临着想要和小伙伴一起玩游戏&#xff0c;但小伙伴没有电脑/只有低配电脑的问题。与此同时&#xff0c;笔者自身的电脑是高配置的电脑&#xff0c;因此笔者想到&#xff0c;能否在自己的电脑上运行游戏&#xff0c;在小伙伴的电脑上…

Linux基础IO【文件系统】

目录 1.磁盘文件 2.磁盘概念 2.1基本结构 2.2数据存储 3磁盘信息 3.1块组信息 4.文件操作 4.1文件创建 4.2文件访问 4.3对文件增删查改 4.4大文件存储 总结&#xff1a; 1.磁盘文件 在计算机中&#xff0c;没有被打开的文件都是静静的躺在外存&#xff08;磁盘…

String为什么是不可变的?

原因一、String字符串类型的数据结构 字符串在String类的内部是用一个char[]数组表示的,而这个数组使用final关键字修饰的&#xff0c;所以不能修改。 举例说明&#xff1a; String ip"127.0.0.1"; String retip.replace(".","#"); System.out.…

Robotframework 的简介及其工作原理~

下面通过官网和网上资料来简单介绍下Robotframework及其工作原理。 官方说明&#xff1a; Robot Framework is a generic test automation framework for acceptance testing and acceptance test-driven development (ATDD). It has easy-to-use tabular test data syntax a…