C语言IO操作

文件的概念和类型

概念:一组相关数据的有序集合

文件类型:

  1. 常规文件 r
  2. 目录文件 d
  3. 字符设备文件 c
  4. 块设备文件 b
  5. 管道文件 p, 进程间通信的机制
  6. 套接字文件 s, 进程间通信的机制
  7. 符号链接文件 l

如何理解标准IO

标准IO由ANSIC标准定义,就是用标准C语言定义好的一组用来输入和输出的API

主流操作系统(Linux,Windows)上都实现了C库

标准IO通过缓冲机制减少系统调用,实现更高的效率

流(FILE)的含义

标准IO用一个结构体数据类型来存放打开的文件的相关信息

标准IO的所有操作都围绕FILE来进行

FILE又被称为流(stream)

流分为两种流分别是

  文本流:Windows系统中文本流的换行符占用两个字节用“\r\n”表示,LInux中用‘\n’表示

  二进制流:Windows系统二进制流的换行符占用一个字节用“\n”表示,LInux中用‘\n’表示

流的缓冲

全缓冲:当流的缓冲区无数据或无空间时才执行实际IO操作

行缓冲:当在输入和输出中遇到换行符“\n”时,进行IO操作;当流和一个终端关联时,是典型的行缓冲

无缓冲:数据直接写入文件,流不进行缓冲,一般在打印错误信息时使用

标准IO预定义3个流,程序运行时自动打开

标准输入流0STDIN_FILENOstdin
标准输出流1STDOUT_FILENOstdout
标准错误流2STDERR_FILENOstderr

流的打开

下列函数可用于打开一个标准IO流

FILE *fopen(const char *path, const char *modle);

成功时返回流指针;出错时返回NULL

model参数

模式描述
r或rb打开一个已有的文本文件,允许读取文件。
w或wb打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a或ab打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+或r+b打开一个文本文件,允许读写文件。
w+或w+b打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+或a+b打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

  

  当给定b参数时,表示以二进制方式打来文件,但linux下忽略该参数

fopen新建文件权限

  fopen()创建的文件访问权限是0666(rw-rw-rw),0表是8进制数

  Linux系统中umask设定会影响文件的访问权限,其规则为(0666 & (~umask)),可以通过umask命令查看,默认为0022

  0022  ----> 000 010 010

  取反   ----> 111 101 101

  0666  ----> 110 110 110

  结果:---> 110 100 100   ---> 0644(rw-r--r--)

  用户可以通过umask函数修改相关设定,将umask设置为0时,umask不影响文件访问权限

错误信息处理

extern int errno;//存放错误号

void perror(const char *s);//向输出字符串s,再输出错误号对应的错误信息

char *strerror(int errno);//根据错误号返回对应的错误信息

流的关闭

int fclose(FILE *stream)

fclose()调用成功返回0,失败返回EOF,并设置errno

流关闭时自动刷新缓冲中的数据并释放缓冲区

当一个程序正常终止时,所有打开的流都会被关闭,但是为了安全期间,程序员要主动关闭

流一旦关闭后就不能执行任何操作

相关推荐