文件IO(二)

文件IO(二)

  • 标准IO
    • 缓冲类型
      • 全缓冲
      • 行缓冲
      • 不缓冲
    • 打开文件
      • fopen
    • 操作文件
      • 按字符读写(fgetc fputc)
      • 按行读写(fgets fputs)
      • 按块(对象)读写(fread fwrite)
      • 按格式化读写(fscanf fprintf)
      • 关闭文件(fclose)
    • 相关的函数
      • 强制刷新缓冲区(fflush)
      • 判断文件是否到末尾(feof)
      • 获取本地时间(time)
      • 光标跳转(fseek、ftell)

标准IO

标准IO:
1.标准IO由ANSI C标准定义, 库函数提供的
2.跨平台性,移植性较好
3.有缓冲区的操作,标准IO的效率比文件IO的效率高
4.一般以文件流指针作为操作依据

缓冲类型

全缓冲

缓冲区满了,或者强制刷新缓冲区
在这里插入图片描述

行缓冲

缓冲区满了,碰到换行符或者强制刷新缓冲区
在这里插入图片描述

不缓冲

缓冲区的数据及时的出来了
在这里插入图片描述

打开文件

fopen

#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
函数功能:以mode表示的形式打开pathname表示的文件的路径
函数参数:pathname 表示被打开的文件的路径
mode 打开文件的方式


r 以只读的形式打开文件,光标置于开头
r+ 以可读可写的形式打开文件,光标置于开头
w 以只写的形式打开文件,文件存在清空打开,文件不存在新建,光标置于开头
w+ 以可读可写的形式打开文件,文件存在清空打开,文件不存在新建,光标置于开头
a 以追加的形式打开文件(写在末尾),文件不存在则新建,光标置于文件末尾
a+ 以可读并追加的形式打开文件,文件不存在则新建,光标置于文件末尾
函数返回值:指针,成功返回打开的文件的流指针,失败返回NULL,并更新errno

在这里插入图片描述

操作文件

按字符读写(fgetc fputc)

#include <stdio.h>
int fgetc(FILE *stream);
函数功能:读stream指示的文件,成功返回读到的数据(无符号的char强转成的int),失败或者读完了返回EOF(-1)
int fputc(int c, FILE *stream);
函数功能:将c转换成无符号的char数据,写入到文件stream里

实现cat命令
在这里插入图片描述
实现cp命令
在这里插入图片描述

按行读写(fgets fputs)

#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
函数功能:从stream指示的流中读取size-1个字符给s指示的空间
最后一个字符给\0预留
函数返回值:成功返回s的地址,失败返回NULL
int fputs(const char *s, FILE *stream);
函数功能:王stream指示的文件流中写入s指示的数据,写到\0为止
函数返回值:成功返回成功写入的大小,失败返回-1

实现:统计一个文件中有多少行

在这里插入图片描述
在这里插入图片描述

按块(对象)读写(fread fwrite)

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数功能:从stream指示的文件中读nmemb个数据,每一个数据有size个大小,到ptr指示的空间中
函数返回值:成功返回成功读到的个数,失败返回0
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
函数功能:往stream里面写nmemb个数据,每一个数据有size个大小,数据从ptr来的
函数返回值:成功返回成功写入的个数,失败返回0

案例,通过fwrite保存数据,另外一个程序通过fread读取数据
myhead.h

#ifndef _MYHEAD_H_
#define _MYHEAD_H_
#include <stdio.h>
typedef struct student
{char name[20];char id[20];int age;
}Stu;
#endif

mywri.c

#include "myhead.h"
int main(int argc, const char *argv[])
{FILE *pw = NULL;//打开文件pw = fopen("msg.txt", "w");if(!pw){perror("open");return -1;}//操作文件//1.给数据赋值Stu stu1 = {"xiaoming", "yan24020202", 24};//写数据,内存stu1 --> 文件pw//fwrite(ptr, size, nmemb, stream);fwrite(&stu1, sizeof(Stu), 1, pw);//关闭文件fclose(pw);return 0;
}

myred.c

#include "myhead.h"
#include <stdlib.h>
#include <string.h>
int main(int argc, const char *argv[])
{FILE *pr = NULL;//申请一片空间Stu *ptr = (Stu *)malloc(sizeof(Stu));//清空memset(ptr, 0, sizeof(Stu));//打开文件pr = fopen("msg.txt", "r");if(!pr){perror("open");return -1;}//操作文件//将数据,从pr中读到内存上来使用//fread(ptr, size, nmemb, stream);fread(ptr, sizeof(Stu), 1, pr);printf("name : %s \n", ptr->name);printf("id : %s \n", ptr->id);printf("age : %d \n", ptr->age);//关闭文件fclose(pr);return 0;
}

按格式化读写(fscanf fprintf)

#include <stdio.h>
int fprintf(FILE *stream, const char *format, …);
函数功能:往指定的文件中输出信息,用法和printf一样
int fscanf(FILE *stream, const char *format, …);
函数功能:从指定的文件中读取数据,用法和scanf一样

关闭文件(fclose)

#include <stdio.h>
int fclose(FILE *stream);
函数功能:关闭stream指示的流

相关的函数

强制刷新缓冲区(fflush)

#include <stdio.h>
int fflush(FILE *stream);

判断文件是否到末尾(feof)

#include <stdio.h>
int feof(FILE *stream);

获取本地时间(time)

#include <time.h>
time_t time(time_t *tloc);
函数功能:获取本机时间(以秒数存储,从1970年1月1日0:0:0开始到现在)
返回值:获得的秒数,如果形参非空,返回值也可以通过传址调用的形式返回

在这里插入图片描述

#include <time.h>
struct tm *localtime(const time_t timep);
函数功能:将timep(时间戳变量)转成认识的结果,将结果封装成struct tm类型的结构体
返回值:返回struct tm类型的结构体指针
struct tm {
int tm_sec; / Seconds (0-60) /
int tm_min; /
Minutes (0-59) /
int tm_hour; /
Hours (0-23) /
int tm_mday; /
Day of the month (1-31) /
int tm_mon; /
Month (0-11) /
int tm_year; /
Year - 1900 /
int tm_wday; /
Day of the week (0-6, Sunday = 0) /
int tm_yday; /
Day in the year (0-365, 1 Jan = 0) /
int tm_isdst; /
Daylight saving time */
};

在这里插入图片描述

光标跳转(fseek、ftell)

#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
函数功能:跳转光标
函数参数1:待跳转光标的文件
函数参数2:光标的偏移量
函数参数3:从哪里开始偏移
SEEK_SET, 从文件开头
SEEK_CUR, 从当前位置
SEEK_END, 从文件末尾
返回值:成功返回0,失败返回-1并更新errno
long ftell(FILE *stream);
函数功能:返回stream文件的光标的位置

案例:获取一个文件有多大

1.打开文件
2.光标跳转到末尾 (SEEK_END 0 )
3.返回当前光标的位置

在这里插入图片描述
案例:制作一个空洞文件
在这里插入图片描述

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

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

相关文章

计算机网络学习笔记——应用层

一、应用层概述 二、客户/服务器方式(C/S方式)和对等方式(P2P方式) 客户/服务器(Client/Server&#xff0c;C/S)方式 服务器总是处于运行状态&#xff0c;并等待客户的服务请求。服务器具有固定端口号(例如HTTP服务器的默认端口号为80)&#xff0c;而运行服务器的主机也具有固…

使用git生成SSH公钥,并设置SSH公钥

1、在git命令行里输入以下命令 ssh-keygen -t rsa 2、按回车&#xff0c;然后会看到以下字眼 Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/xxx/.ssh/id_rsa) 例&#xff1a; 3、继续回车&#xff0c;然后会看到以下字眼 Enter…

Linux中断

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、中断的相关概念1.中断号2.中断的申请和释放申请API函数如下&#xff1a;释放API函数如下&#xff1a;中断处理函数如下&#xff1a;使能和禁止中断 二、上半…

Mac安装tomcat

代码 brew install tomcat 运行结果如下&#xff1a; 如果要启动输入&#xff1a; brew services start tomcat

Linux学习笔记(epoll,IO多路复用)

Linux learning note 1、epoll的使用场景2、epoll的使用方法和内部原理2.1、创建epoll2.2、使用epoll监听和处理事件 3、示例 1、epoll的使用场景 epoll的英文全称是extend poll&#xff0c;顾名思义是poll的升级版。常见的IO复用技术有select&#xff0c;poll&#xff0c;epo…

连锁收银系统支持带结算功能

连锁实体店的收银系统需要支持结算功能&#xff0c;以适应连锁运营效率和提升连锁管理的水平。商淘云连锁收银系统与您一起分享连锁收银系统需支持结算功能的三大必要点。大家点赞收藏&#xff0c;以免划走后找不到了。 一是&#xff0c;连锁模式的运营比较复杂&#xff0c;有加…

同时执行多个python脚本扫描,报如下错误,原因为文件越大读取到内存占用内存越多。

killed nohup python $file unable to fork process cannot allocate memory ls: error while loading shared libraries: libdl.so.2 failed to map segment from shared object cannot allocate memory python进程被系统或者某个用户通过 kill 命令强制终止了

Iphone自动化指令每隔固定天数打开闹钟关闭闹钟(二)

1.首先在搜索和操作里搜索“查找日期日程" 1.1.然后过滤条件开始日期选择”是今天“ 1.2.增加过滤条件&#xff0c;日历是这里选择”工作“ 1.3.增加过滤条件&#xff0c;选择标题&#xff0c;是这里选择”workDay“ 1.4选中限制&#xff0c;日历日程只要一个&#xff0c;…

Vue从入门到实战Day07

一、vuex概述 目标&#xff1a;明确vuex是什么&#xff0c;应用场景&#xff0c;优势 1. 是什么&#xff1a; vuex是一个vue的状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;vuex是一个插件&#xff0c;可以帮助我们管理vue通用的数据&#xff08;多组件共享的…

九章云极DataCanvas公司DingoDB完成中国信通院权威多模数据库测试

2024年5月16日&#xff0c;九章云极DataCanvas公司自主研发和设计的开源多模向量数据库DingoDB顺利完成中国信息通信研究院&#xff08;以下简称中国信通院&#xff09;多模数据库产品测试。本次测试的成功标志着DingoDB在技术能力、性能表现和产品稳定性方面得到了权威机构的高…

go语言的使用方法

一.go语言的介绍 1.简介 2.应用领域 3.使用go语言的公司 4.go语言开发工具介绍 5.go语言开发环境搭建 【1】搭建Go开发环境-安装和配置SDK 基本介绍: 1).SDK的全称(Software Development Kit软件开发工具包&#xff09;2).SDK是提供给开发人员使用的&#xff0c;其中包含了…

蓝海卓越计费管理系统 agent_setstate.php SQL注入漏洞复现

0x01 产品简介 蓝海卓越计费管理系统是一套以实现网络运营为基础,增强全局安全为中心,提高管理效率为目的的网络安全运营管理系统,提供“高安全、可运营、易管理”的运营管理体验,基于标准的RADIUS协议开发,它不仅支持PPPOE和WEB认证计费,还支持802.1X接入控制技术,与其…

详解 HTML5 服务器发送事件(Server-Sent Events)

HTML5 服务器发送事件&#xff08;server-sent event&#xff09;允许网页获得来自服务器的更新。 EventSource 是单向通信的&#xff08;是服务器向客户端的单向通信&#xff0c;客户端接收来自服务器的事件流&#xff09;、基于 HTTP 协议&#xff08;EventSource 是基于标准…

5.29_Java程序流程控制

CSDN 同C语言的流程同 1、补充&#xff1a; 1、switch使用时的注意事项 1、表达式只能是byte、short、int、char&#xff0c;JDK5开始支持枚举&#xff0c;JDK7开始支持String、不支持double、float、long switch里面是做分支匹配&#xff0c;也就是可以出现很多分支&am…

JavaScript-JavaWeb

目录 什么是JavaScript? js引入方式 js基础语法 书写语法 变量 数据据类型 运算符 类型转换 流程语句 js函数 js对象 1.Array 2.String 3.JSON js事件监听 什么是JavaScript? ● JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能…

前缀和(下)

目录 热身&#xff1a; 寻找数组的中心下标 题解&#xff1a; 代码&#xff1a; 进阶&#xff1a; 除自身之外数组的乘积 题解&#xff1a; 代码&#xff1a; 和为K的子数组 题解&#xff1a; 代码&#xff1a; 和可被 K 整除的子数组 题解&#xff1a; 同余定理…

mysql - 索引原理

mysql索引原理 文中的查询, 以该表结构为例 CREATE TABLE user (id int NOT NULL COMMENT id,name varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT 姓名,age int NOT NULL COMMENT 年龄,sex tinyint(1) NOT NULL COMMENT 性别,phone varchar(255) CHARACTER SET utf8mb4…

esp32-idf 开发踩坑记录

现象 直接使用原始命令编译idf.py build 但是提示idf 版本错误 卸载旧版本 编译出错build 问题 然后删除编译文件后&#xff0c;重新编译&#xff0c;还是出错 解决方法1 最后发现是因为项目所在文件夹有中文目录&#xff0c;把项目迁移到英文目录后&#xff0c;重新编译&a…

⌈ 传知代码 ⌋ YOLOv9最新最全代码复现

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第29课-会员制展厅

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第29课-会员制展厅 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…