C语言 流文件

news/2024/9/23 4:25:48/

抽象化的IO操作被封装,流

printf和scanf借助于标准输入和输出流stdin,stdout特殊的由C标准库管理的文件流

带用户态缓冲区的文件流,流也可以不带缓冲区。

输入流缓冲区只要有就可以读,不能刷新(未定义行为)。输出流缓冲区需要手动刷新。

stdout 行缓冲区 换行符会自动刷新,可以用fflush函数手动刷新

文件输出缓冲区,装满会自动刷新,当然程序退出也会刷新。

流文件的输入和输出是按顺序的,提供接口不用了解怎么输出输入

流文件需要手动开关

缓冲区可以整合数据,一个字符一个字符的输入,会被放到缓冲区中,减少对于底层访问降低速度差提高性能。缓冲区同样可以阻塞。

文件流:文件流有相应的文件缓冲区,平衡内存和设备之间的性能差距

标准流(Standard Streams)可以视为特殊的文件流

<stdio.h> 头文件中提供了 3 个标准流:stdin, stout, stderr

stderr是不借助于缓冲区的

打开和关闭文件流:fopen 和 fclose

FILE* fopen(const char* filename, const char* mode);
FILE*fp =fopen("1.txt", "r);
if(fp == NULL)

可以理解FILE*指针为一个读或者是写的指针的集合

filename:放绝对路径或者是相对路径

mode:文件的打开模式:r:只写,r+ : 可读可写模式 (都是只能小写r)

r和r+模式不会文件截断

a:(append)追加模式

w:只写模式,此时打开文件若不存在会自动创建一个再写入,如果文件存在会截断再写入

比如用w模式打开文件,在fopen函数调用的那一行就已经对原文件做出了处理截断清空处理

w+:可读写 a+:追加可读写

以二进制文件的模式打开一个文件 rb,wb, ab, rb+,wb+, ab+

windows平台下有这两个文件的区别但是别的没有

windows平台下换行符是两个字符实际上,是回车+换行。因此必须区分文本文件和二进制文件:换行是\r\n 二进制是\n,也因此别的平台没有必要区分

Unixs平台下只是一个换行字符

任何情况,读指针都是从开头,写指针的位置与模式有关。

若打开文件失败会返回一个NULL指针

路径分隔符:windows文件路径分隔符使用的是“\\”    盘符开头一定是一个绝对路径名

                     类Unix操作系统文件分隔符使用的是“/” (目前windows也可以识别)

 绝对路径一定安全,相对路径查找更便利(直接把文件放在对应文件夹中,可以直接访问)

相对路径是在文件在改变位置以后,可能会出现招不到文件的情况

读文件的方式:

1. 一个字符一个字符的读

fgetc函数:从文件流中读到一个字符。

fputc函数:将一个字符写入文件流。

int fgetc(FILE* stream);
int fputc(int c, FILE* stream);
//成功会返回放置元素的ASCII
fputc("1", fp);//会变为ASCII码数字
fflush(fp);//对比
fgetc(stdin) = getchar();
fputc(c, stdout) = putc();
rewind(fp);

//一定注意文件指针的位置!

文件指针位置的问题,c语言输入和输出只有一个流,不像c++或者是jave有两个流,因此说当开始读文件然后再写文件的时候就相当于追加写入。如果不想追加写入还是想移到开头进行覆盖写入就用rewind。

因此在模式选择的时候权限要少给,只是满足够用就可以,只读就r, 只写就w,追加模式打开就a

当执行完输出操作以后,要进行自己的手动刷新,不然只是放在缓冲区中没有放在文件中

输入的最后一个字符是EOF结束,是-1

返回值是int类型,因为返回的是ASCII类型

区分fgets与fputs函数

char* fgets(char* str, int count, FILE* stream);

str是指向字符数组的指针,count是字符串的长度,stream任意输入流

实际上最多读取count-1个字符最后的结束字符不会读入

printf:标准化方式向输出流输出数据
fprintf:以格式化形式向文件流输出数据

int fprintf(FILE* stream, const char* format, ...), 输出错误信息就fprintf(stderr, const char* format, ...),如果是fprintf(stdout, ...)

sprintf:以格式化方式向一个字符数组输出数据,保证输出目的地是一个字符串

sprintf(char* str, const char* format, ...)

scanf:以格式化方式从标准输入流读数据,默认从键盘读数据

fscanf:以格式化方式从文件流中读取信息

fscanf(FILE* ftream, const char* format, ...)

fscanf(dest, "str = %s,a = %d,b = %lf,c = %c", str2, &a2, &b2, &c2);

读字符串时会将分隔符,读入 用%[^,]都字符串读到,就结束了此时空格不会结束

fscanf(dest, "str = %[^,], a = %d,b = %lf,c = %c", str2, &a2, &b2, &c2);

sscanf:

一下函数都处理文本文件,不要用于处理二进制文件

fgetc/fputc,fgets/futs,fprintf/fscanf

有专门的一对函数(处理文件)处理二进制文件fread和fwrite

fread和fwrite可以读写一大段数据,返回值类型是size_t,表示有多少个数据被读或者写

fseek和ftell是获取文件大小的常用的手段。


http://www.ppmy.cn/news/1431126.html

相关文章

SQLite的DBSTAT 虚拟表(三十六)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite运行时可加载扩展(三十五&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 1. 概述 DBSTAT 虚拟表是一个只读的同名虚拟表&#xff0c;返回 有关用于存储内容的磁盘空间量的信息 的 SQLite 数据库。 示例用例…

读天才与算法:人脑与AI的数学思维笔记07_数字绘画

1. 数字绘画 1.1. 事物的可预测性与不可预测性构成了我们熟识的世界 1.1.1. 汤姆斯托帕德&#xff08;Tom Stoppard&#xff09; 1.2. 艺术作品就是通过各种形式给人带来美的感受&#xff0c;从而使人们获得精神上的愉悦与放松 1.3. …

Linux I2C(二) - I2C软硬件架构

1&#xff0c;I2C的总线拓扑 2&#xff0c;I2C S/W topology linux kernel I2C framework使用如下的软件拓扑抽象I2C硬件&#xff08;我们可以一起领会一下其中的“设备模型”思想&#xff09;&#xff1a; 1&#xff09;platform bus&#xff08;/sys/bus/platform&#xff0…

【第六章】集合类:List、Iterator迭代器

目录 1.集合类 1.1 什么是集合类 1.2 集合类的分类 2.Collection接口 3.List集合 3.1 ArrayList集合 3.2 LinkedList集合 3.3 ArrayList和LinkedList对比 3.4 创建List对象 4 Iterator接口 5 foreach循环 6 代码练习 1.集合类 1.1 什么是集合类 集合类就像一个容器&a…

云原生周刊:Kubernetes v1.30 发布 | 2024.4.22

开源项目推荐 pv-migrate pv-migrate 是一个 CLI 工具/kubectl 插件&#xff0c;可轻松将一个 Kubernetes 的内容迁移 PersistentVolumeClaim 到另一个 Kubernetes。 Claudie Claudie 是一个云原生的 Kubernetes 管理平台&#xff0c;具备跨多个云提供商和本地数据中心的多…

TCP/IP协议(二)

一、TCP-选项 1.简介 在TCP/IP报文中&#xff0c;固定头部下边就是 "选项"部分。 (1)TCP头部的选项部分是TCP为了适应复杂的网络环境和更好的服务应用层而进行设计的 (2)大多数的TCP选项部分出现在TCP连接建立阶段 2.构成 2.1 最大报文传输段 最大报文传输段(Ma…

vue中如何控制一个全局接口的调用频率

业务说明 在app.vue&#xff0c;created中调用了一个同步用户信息的接口&#xff0c;但不希望每个页面刷新都会调用&#xff0c;并限制在页面的调用频率 具体实现 /*** 判断是否应该调用接口 白名单下的直接调用* param {String} api_name 接口名字* param {String} router_…

Python基于Django的旅游城市关键词分析和提取,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…