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

news2024/10/6 16:17:59

温习:

文件的拷贝(单个字符)(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.coloradmin.cn/o/1462843.html

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

相关文章

指南 | 从概念到实践:探索独立站在当代电商中的关键作用

搭建电商独立站指南 随着数字化时代的到来&#xff0c;电子商务已成为全球商业生态的核心组成部分。在这个不断变化的市场中&#xff0c;独立站作为企业建立在线身份和拓展业务的强大工具&#xff0c;正逐步展现出其不可替代的价值。 从概念到实践&#xff0c;本文将深入探索独…

1500W SMB TVS

TVS的简介 瞬态电压抑制二极管&#xff0c;简称TVS。当TVS两极受到反向瞬态高能量冲击时&#xff0c;它能以 10- s的速度&#xff0c;将其两极间的高阻抗变为低阻抗&#xff0c;吸收高达数千瓦的浪涌功率&#xff0c;使两极间的电压钳位于一个预定值&#xff0c;有效地保护电子…

Linux环境安装Git(详细图文)

说明 此文档Linux环境为&#xff1a;Ubuntu 22.04&#xff0c;本文档介绍两种安装方式&#xff0c;一种是服务器能联网的情况通过yum或apt命令下载&#xff0c;第二种采用源码方式安装。 一、yum/apt方式安装 1.yum方式安装Git 如果你的服务器环境是centos/redhot&#xff…

理论学习-ARM-内核

ARM内核 函数的调用加载、存储计算中断异常线程的切换注意事项参考文献 为了提高学习效率&#xff0c;我们要提前想好学习策略。 首先&#xff0c;使用频率越高的知识点&#xff0c;越要首先学习。假使&#xff0c;我们学习了一个知识点&#xff0c;能覆盖工作中80%的工作量&am…

Java Swing游戏开发学习1

不使用游戏引擎&#xff0c;只使用Java SDK开发游戏的学习。 游戏原理 图片来自某大佬视频讲解 原理结合实际代码 public class GamePanel extends Jpanel implements Runnable {...run(){}// 详情看下图... }项目结构 运行效果 代码code 在我的下载里面可以找到&#xf…

【MATLAB】EEMD_ MFE_SVM_LSTM 神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 EEMD_MFE_SVM_LSTM神经网络时序预测算法是一种结合了多种技术的复杂预测方法&#xff0c;旨在提高时序预测的准确性和稳定性。以下是对该算法的详细介绍&#xff1a; EEMD&#xff08;扩展…

VSCODE上使用python_Django_创建最小项目

接上篇 https://blog.csdn.net/weixin_44741835/article/details/136135996?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136135996%22%2C%22source%22%3A%22weixin_44741835%22%7D VSCODE官网&#xff1a; Editing Python …

【DWRSeg】重新思考高效获取多尺度上下文信息以进行实时语义分割

目录 &#x1f436;&#x1f436;1.摘要 &#x1f42d;&#x1f42d; 2.设计动机 &#x1f439;&#x1f439; 3.区域残差和语义残差 &#x1f430;&#x1f430; 4.Dilation-wise Residual和Simple Inverted Residual &#x1f343; 4.1DWR &#x1f342; 4.2SIR &…

OpenGauss数据库本地搭建并结合内网穿透实现远程访问

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合…

C语言的位操作 - bit 、byte的清零,置1,提取,判断

下面分享关于位操作的一些笔记&#xff1a; 一、位操作简单介绍 首先&#xff0c;以下是按位运算符&#xff1a; 在嵌入式编程中&#xff0c;常常需要对一些寄存器进行配置&#xff0c;有的情况下需要改变一个字节中的某一位或者几位&#xff0c;但是又不想改变其它位原有的值…

【Spring Cloud】实现微服务调用的负载均衡

文章目录 什么是负载均衡自定义实现负载均衡启动shop-product微服务通过nacos查看微服务的启动情况自定义实现负载均衡 基于Ribbon实现负载均衡添加注解修改服务调用的方法Ribbon支持的负载均衡策略通过修改配置来调整 Ribbon 的负载均衡策略通过注入Bean来调整 Ribbon 的负载均…

什么是nginx 、安装nginx

一、 什么是nginx 1.1 nginx的概念 一款高新能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 1.2 nginx模块与作用 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错…

FPGA OSERDESE2

Output Parallel-to-Serial Logic Resources (OSERDESE2) OSERDESE2 在Xilinx 7 系列器件是一款专用的并行至串行转换器,具有特定的时钟和逻辑资源,旨在促进高速源同步接口的实现。每个OSERDESE2模块都包括一个专用的数据串行器和 3 状态控制。数据和 3 态串行器都可以在 SD…

Vue 中 onclick和@click区别

文章目录 一、直接上结论二、验证代码&#xff0c;可直接运行三、点击结果 一、直接上结论 onclick 只能触发 js的原生方法&#xff0c;不能触发vue的封装方法click 只能触发vue的封装方法&#xff0c;不能触发js的原生方法 二、验证代码&#xff0c;可直接运行 <!DOCTYP…

数据的结构

数据结构介绍 数据结构是一门介于数学、计算机硬件和计算机软件三者之间的核心课程。数据结构不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序和大型应用程序的重要基础。 数据结构研究的是数据对象内部各数据元素之间逻辑关系问题…

【C++练级之路】【Lv.8】【STL】list类的模拟实现

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、结点二、迭代器2.1 成员变量与默认成员函数2.2 operator*2.3 operator->2.4 operator2.5 operator- …

Go语言中的TLS加密:深入crypto/tls库的实战指南

Go语言中的TLS加密&#xff1a;深入crypto/tls库的实战指南 引言crypto/tls库的核心组件TLS配置&#xff1a;tls.Config证书加载与管理TLS握手过程及其实现 构建安全的服务端创建TLS加密的HTTP服务器配置TLS属性常见的安全设置和最佳实践 开发TLS客户端应用编写使用TLS的客户端…

[设计模式Java实现附plantuml源码~行为型]遍历聚合对象中的元素——迭代器模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

ElasticSearch语法

Elasticsearch 概念 入门学习: Index索引>MySQL 里的表(table)建表、增删改查(查询需要花费的学习时间最多)用客户端去调用 ElasticSearch(3 种)语法:SQL、代码的方法(4 种语法) ES 相比于 MySQL&#xff0c;能够自动帮我们做分词&#xff0c;能够非常高效、灵活地查询内…

基于springboot+vue的教学资源库系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…