一、文件的概念和类型
1、文件概念: 一组相关数据的有序集合
2、文件类型:块设备文件:b、字符设备文件:c、目录文件:d、符号链接文件:l、管道文件:p、常规文件:r、套接字文件:s
二、标准I/O
1、标准I/O介绍
标准I/O由ANSI C标准定义
主流操作系统上都实现了C库
标准I/O通过缓冲机制减少系统调用,实现更高的效率
2、标准I/O——流
FILE
标准I/O用一个结构体类型来存放打开的文件的相关信息
标准I/O的所有操作都是围绕FILE来进行
流(stream)
FILE又被称为流(stream)
3、标准I/O——文本流/二进制流
Windows
二进制流:换行符 ‘ ’
文本流: 换行符 ‘ ’‘ ’
Linux
换行符 ‘ ’
4、标准I/O——流的缓冲类型
全缓冲:当流的缓冲区无数据或无空间时才执行实际I/O操作
行缓冲:当在输入和输出中遇到换行符(‘ ’)时,进行I/O操作;当流和一个终端关联时,典型的行缓冲
无缓冲:数据直接写入文件,流不进行缓冲
5、标准I/O——stdin,stdout,stderr
标准I/O预定义3个流,程序运行时自动打开
标准输入流0 STDIN_FILENO stdin
标准输出流1 STDOUT_FILENO stdout
标准错误流2 STDERR_FILENO stderr
6、标准I/O——打开流
下列函数可用于打开一个标准I/O流:FILE *fopen (const char *path, const char *mode);
成功时返回流指针;出错时返回NULL
a、path参数:文件路劲
b、mode参数:
“r” 或 “rb” 以只读方式打开文件,文件必须存在。
“r+” 或 ”r+b” 以读写方式打开文件,文件必须存在。
“w” 或 “wb” 以只写方式打开文件,若文件存在则文件长度清为0。若文件不存在则创建。
“w+” 或 “w+b” 以读写方式打开文件,其他同”w”。
“a” 或 “ab” 以只写方式打开文件,若文件不存在则创建;向文件写入的数据被追加到文件末尾。
“a+” 或 “a+b” 以读写方式打开文件。其他同”a”
*当给定”b”参数时,表示以二进制方式打开文件,但Linux下忽略该参数
c、新建文件权限
fopen() 创建的文件访问权限是0666(rw-rw-rw-);Linux系统中umask设定会影响文件的访问权限,其规则为(0666 & ~umask);用户可以通过umask函数修改相关设定
7、标准I/O——处理错误信息
extern int errno;
void perror(const char *s);
char *strerror(int errno);
errno存放错误号
perror先输出字符串s,再输出错误号对应的错误信息
strerror根据错误号返回对应的错误信息
8、标准I/O——关闭流
fclose()调用成功返回0,失败返回EOF,并设置errno
流关闭时自动刷新缓冲中的数据并释放缓冲区
当一个程序正常终止时,所有打开的流都会被关闭。
流一旦关闭后就不能执行任何操作
9、标准I/O——按字符读写流
下列函数用来输入一个字符:
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);
成功时返回读取的字符;若到文件末尾或出错时返回EOF。
下列函数用来输出一个字符:
#include <stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
成功时返回写入的字符;出错时返回EOF。
10、标准I/O——按行读写流
下列函数用来输入一行:
#include <stdio.h>
char *gets(char *s);
char *fgets(char *s, int size, FILE *stream);
成功时返回s,到文件末尾或出错时返回NULL
gets不推荐使用,容易造成缓冲区溢出
遇到’ ’或已输入size-1个字符时返回,总是包含’ ’
下列函数用来输出字符串:
#include <stdio.h>
int puts(const char *s);
int fputs(const char *s, FILE *stream);
成功时返回输出的字符个数;出错时返回EOF。
puts将缓冲区s中的字符串输出到stdout,并追加’ ’
fputs将缓冲区s中的字符串输出到stream
11、标准I/O——按对象读写
下列函数用来从流中读写若干个对象:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
成功返回读写的对象个数;出错时返回EOF
既可以读写文本文件,也可以读写数据文件
效率高
12、标准I/O——刷新流
#include <stdio.h>
int fflush(FILE *fp);
成功时返回0;出错时返回EOF
将流缓冲区中的数据写入实际的文件
Linux下只能刷新输出缓冲区
13、标准I/O——定位流
#include <stdio.h>
long ftell(FILE *stream);
long fseek(FILE *stream, long offset, int whence);
void rewind(FILE *stream);
ftell() 成功时返回流的当前读写位置,出错时返回EOF
fseek()定位一个流,成功时返回0,出错时返回EOF
whence参数:SEEK_SET/SEEK_CUR/SEEK_END
offset参数:偏移量,可正可负
rewind()将流定位到文件开始位置
读写流时,当前读写位置自动后移
14、标准I/O——判断流是否出错和结束
#include <stdio.h>
int ferror(FILE *stream);
int feof(FILE *stream);
ferror()返回1表示流出错;否则返回0
feof()返回1表示文件已到末尾;否则返回0
15、标准I/O——格式化输出
#include <stdio.h>
int printf(const char *fmt, …);
int fprintf(FILE *stream, const char *fmt, …);
int sprintf(char *s, const char *fmt, …);
成功时返回输出的字符个数;出错时返回EOF。