尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux软件编程(2)标准IO

Linux软件编程(2)标准IO 这两天学习了C语言标准文件IO相关内容。标准IO是我们操作文件的基础不管是读取文本词典、读写配置文件还是复制图片这类二进制文件都离不开这套接口。一、基础概念文件本质是存放在磁盘上的一段数据集合。在C语言中操作文件固定分为三步打开文件、读写文件、关闭文件。我们操作文件时程序和文件之间会建立流。流具备方向性与连续性。程序启动时系统会默认打开三个流标准输入流stdin、标准输出流stdout、标准错误流stderr也就是我们平时的键盘输入、屏幕打印输出。文件分为ASCII文本文件和二进制文件。文本文件里全部是可正常显示的ASCII字符比如我们写的C代码、txt笔记二进制文件包含大量无法直接在终端展示的字符图片、音视频、压缩包都属于二进制文件。文本文件可以用逐字符、逐行的函数读写二进制文件一般使用fread、fwrite整块读写。二、打开与关闭文件fopen 打开文件FILE *fopen(const char *pathname, const char *mode);函数作用找到路径对应的文件建立程序与文件之间的数据流返回FILE类型指针后续所有读写操作都依靠这个指针。打开模式有多种常用规则r只读。文件不存在直接报错只能读取已有文件内容。r读写。文件不存在报错可读可写。w只写。文件不存在则新建文件存在会清空原有内容再写入数据。w读写。文件不存在新建存在则清空原文件。a追加只写。文件不存在新建写入内容会放在文件末尾不会覆盖旧数据。a追加读写。支持读取写入的数据依旧追加在文件尾部。函数调用失败会返回NULL写完代码后必须判断返回值避免空指针操作程序崩溃。fclose 关闭文件int fclose(FILE *stream);文件使用结束后一定要调用fclose关闭流。关闭时会自动刷新缓冲区数据释放资源。成功返回0失败返回EOF。三、缓冲区标准IO自带缓冲区我们调用读写函数时数据不会直接交给操作系统内核先存放在缓冲区满足刷新条件后才完成真正传输。缓冲区分为三类全缓存和普通文件建立的流属于全缓存缓冲区大小4096字节。刷新时机缓冲区存满主动调用fflush强制刷新程序结束、调用fclose关闭流。行缓存和终端交互的流stdin、stdout属于行缓存缓冲区大小1024字节。刷新时机缓冲区存满fflush强制刷新程序结束或关闭流读到换行符\n。无缓存数据写入立刻生效stderr标准错误流就是无缓存适合报错、需要实时交互的场景。四、读写常用函数逐字符读写fputc、fgetcint fputc(int c, FILE *stream);int fgetc(FILE *stream);fputc向流中写入单个字符成功返回字符ASCII码失败返回EOF。fgetc从流读取单个字符读到文件末尾或者读取失败都会返回EOF。适合简单字符写入也可以逐字符读取文件统计文件行数。逐字符串读写fputs、fgetsint fputs(const char *s, FILE *stream);char *fgets(char *s, int size, FILE *stream);fputs将字符串写入流不会自动添加换行符和puts有区别。fgets读取一行字符串。参数size代表最多读取字符数量读取完成后字符串会自带读到的换行\n不会自动丢弃这一点和gets不同。读取失败或到达文件末尾返回NULL。格式化读写fprintfint fprintf(FILE *stream, const char *format, …);用法和printf几乎一致区别是printf默认输出到屏幕stdoutfprintf可以把格式化字符串写入指定文件流。整块二进制读写fwrite、freadsize_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);这一组函数多用于二进制文件操作比如复制图片、音频。ptr数据存放的内存首地址size单个数据块字节大小nmemb一共读写多少个数据块。返回值代表实际成功读写的数据块数量读取到文件末尾或者出错返回0。五、文件偏移定位函数文件读写时存在读写位置标记默认从头开始读取下面三个函数可以手动调整这个标记位置fseekint fseek(FILE *stream, long offset, int whence);whence有三个选项SEEK_SET基准点为文件开头SEEK_CUR基准点为当前读写位置SEEK_END基准点为文件末尾。offset代表相对基准点偏移多少字节成功返回0失败返回-1。ftelllong ftell(FILE *stream);获取当前读写位置距离文件开头的偏移字节数常配合fseek获取整个文件长度。rewindvoid rewind(FILE *stream);简化函数直接把读写偏移定位回到文件开头等价于 fseek(stream,0,SEEK_SET)。标准IO整套接口是上层封装使用起来更加便捷自带缓冲区提升读写效率。学习时需要区分文本读写函数和二进制读写函数的适用场景分清各个打开模式的差异同时牢记文件用完必须关闭。
返回列表