文件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.mzph.cn/web/19144.shtml

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

相关文章

stm32学习-CubeIDE使用技巧

1.hex文件生成 右键工程 2.仿真调试 3.常用快捷键 作用快捷键代码提示alt/代码注释/反注释ctrl/ 4.项目复制 复制项目&#xff0c;将ioc文件名改为项目名即可图形化编辑

泛型方法、泛型类

如果不需要把类型参数所表示的对象设为实例字段&#xff0c;那么应该优先考虑创建泛型方法&#xff0c;而不是泛型类 在两种情况下&#xff0c;必须把类写成泛型类&#xff1a; 第一种情况&#xff0c;该类需要将某个值用作其内部状态【属性的返回值、字段的返回值等】&#x…

springboot课程题库管理系统-计算机毕业设计源码30812

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于课程题库管理系统 当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了课程题库管理系统 &#xff0c;它彻底改变了…

【刷题(12)】图论

一、图论问题基础 在 LeetCode 中&#xff0c;「岛屿问题」是一个系列系列问题&#xff0c;比如&#xff1a; 岛屿数量 &#xff08;Easy&#xff09;岛屿的周长 &#xff08;Easy&#xff09;岛屿的最大面积 &#xff08;Medium&#xff09;最大人工岛 &#xff08;Hard&…

【考研数学】数学一和数学二哪个更难?如何复习才能上90分?

很明显考研数学一更难&#xff01; 不管是复习量还是题目难度 对比项考研数学一考研数学二适用专业理工科类及部分经济学类理工科类考试科目高等数学、线性代数、概率论与数理统计高等数学、线性代数试卷满分150分150分考试时间180分钟180分钟试卷内容结构高等数学约60%&…

【Vue3+Typescript】报错:类型 boolean 不可分配给类型 Boolean

Vue3的组件【<button/>】参数是Boolean对象类型,Props的参数类型也是【Boolean对象类型】但是经过Typescript转换之后则变成了boolean简单类型,为此需要手动转换才可以正常使用&#xff01; 报错代码&#xff1a; <script lang"ts"> import { defineCo…

电脑怎么清理c盘垃圾文件 电脑运行内存不足怎么清理

和Windows系统电脑文件分区不同&#xff0c;苹果电脑并不分区&#xff0c;默认只有C盘&#xff0c;当C盘垃圾文件过多&#xff0c;电脑运行内存不足时&#xff0c;手动清理电脑垃圾文件毫无头绪&#xff0c;可以尝试使用苹果电脑清理软件——CleanMyMac来清理 。 一、电脑怎么…

React Hooks是如何保存的

React 函数式组件是没有状态的&#xff0c;需要 Hooks 进行状态的存储&#xff0c;那么状态是怎么存储的呢&#xff1f;Hooks是保存在 Fiber 树上的&#xff0c;多个状态是通过链表保存&#xff0c;本文将通过源代码分析 Hooks 的存储位置。 创建组件 首先我们在组件中添加两…

电商推荐系统+电影推荐系统【虚拟机镜像分享】

电商推荐系统电影推荐系统【虚拟机镜像分享】 所有组件部署好的镜像下载&#xff08;在下面&#xff09;&#xff0c;仅供参考学习。&#xff08;百度网盘&#xff0c;阿里云盘…&#xff09; 博主通过学习尚硅谷电商推荐电影推荐项目&#xff0c;将部署好的虚拟机打包成ovf文…

设计模式复习

一、模式所采用的关系&#xff08;e.g.继承…&#xff09; UML图例 二、各模式的特点、优缺点 1.创建型 将对象的使用和创建分离&#xff0c;使用对象时无需知道对象的创建细节&#xff0c;使得创建过程可以多次复用&#xff0c;且修改两者中的一个对另一个影响为0或很少。 …

Stable Diffusion WebUI详细使用指南

Stable Diffusion WebUI&#xff08;AUTOMATIC1111&#xff0c;简称A1111&#xff09;是一个为高级用户设计的图形用户界面&#xff08;GUI&#xff09;&#xff0c;它提供了丰富的功能和灵活性&#xff0c;以满足复杂和高级的图像生成需求。由于其强大的功能和社区的活跃参与&…

【运维】VMware Workstation 虚拟机内无网络的解决办法(或许可行)

【使用桥接模式】 【重置网络】 这个过程涉及管理Linux系统中的网络驱动程序和网络管理工具。以下是每个步骤的详细解释&#xff1a; 卸载网络驱动模块&#xff1a; sudo rmmod e1000 sudo rmmod e1000e sudo rmmod igb这些命令使用 rmmod&#xff08;remove module&#xff…

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

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

C++语言实现发票查验功能、医疗票据查验、财政票据识别

封账结算是个苦活、累活&#xff0c;在账务干过的人都知道&#xff0c;就连发票都要一张一张的录&#xff0c;一张一张的审&#xff0c;结一次账、扒一层皮&#xff0c;就累得人仰马翻。除此之外&#xff0c;在临近春节的这个时期&#xff0c;账务部门的小伙伴们&#xff0c;只…

【C++】牛客——ISBN号码

✨题目链接&#xff1a; ISBN号码 ✨题目描述 每一本正式出版的图书都有一个ISBN号码与之对应&#xff0c;ISBN码包括9位数字、1位识别码和3位分隔符&#xff0c;其规定格式如“x-xxx-xxxxx-x”&#xff0c;其中符号“-”是分隔符&#xff08;键盘上的减号&#xff09;&#…

MongoDB CRUD操作:mongosh 游标迭代

MongoDB CRUD操作&#xff1a;mongosh 游标迭代 文章目录 MongoDB CRUD操作&#xff1a;mongosh 游标迭代手动迭代光标使用数组迭代游标行为在会话中打开的游标在会话之外打开游标游标隔离游标批次光标信息 在mongosh中&#xff0c;执行 db.collection.find()方法会返回一个游…

速看!!24上软考【电子商务设计师】真题回顾,含答案解析

2024上半年软考考试已经结束了&#xff0c;为大家整理了网友回忆版的电子商务设计师真题及答案&#xff0c;25-26日两批考试总共60道题。 上半年考试的宝子们可以对答案预估分数&#xff01;准备下半年考的宝子可以提前把握考试知识点和出题方向&#xff0c;说不定会遇到相同考…

迭代逆序遍历在Java中的作用与原理

作用 迭代逆序遍历主要用于在需要删除或修改集合中的元素时避免并发修改异常&#xff08;ConcurrentModificationException&#xff09;。正序遍历时&#xff0c;如果在遍历过程中对集合进行结构性修改&#xff08;如删除元素&#xff09;&#xff0c;会导致迭代器抛出并发修改…

C++学习~~对于二进制文件的读写命名空间再认识异常处理

目录 1.将数据以二进制形式放到磁盘 2.将上述的数据读入内存并且显示在显示器上面 3.异常处理机制 4.抛出异常的应用实例 1.将数据以二进制形式放到磁盘 &#xff08;1&#xff09;使用student定义结构体数组stud,并对其进行初始化&#xff0c;创建输出文件流对象outfile,这…

STL库--stack

目录 stack的定义 stack容器内元素的访问 stack常用函数实例解析 stack的常见用途 stack的定义 其定义的写法和其他STL容器相同&#xff0c;typename可以任意基本类型或容器&#xff1a; stack<typename> name; stack容器内元素的访问 由于栈本身就是一种后进先出…