C语言 流文件

本文详细介绍了C语言中关于抽象化的IO操作,如stdio库中的printf、scanf、fgets、fscanf等函数,以及文件流的使用,包括标准流stdin、stdout、stderr,文件操作的打开、关闭、模式选择,缓冲区的作用和管理,以及文本文件与二进制文件的区别和处理方法。
摘要由CSDN通过智能技术生成

抽象化的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是获取文件大小的常用的手段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值