1.文件的概念:存储在外部介质上的数据的集合。
2.文件的分类
普通文件 -
目录文件 d
字符设备文件 c
块设备文件 b
管道文件 p
套接字文件 s
链接文件 l
3.标准的文件描述符
每个程序在执行的时候 会默认的打开三个文件描述符
0:标准输入 stdin
1:标准输出 stdout
2:标准错误 stderr
4.文件操作中访问操作分为两种,第一种是库函数访问(缓冲区操作),就是我们在C语言阶段学习的相关函数,另一种就是系统调用(非缓冲区操作),一般在Linux系统编程阶段学习的。
5.缓冲区的文件操作
1)文件的打开
fopen();
函数原型:FILE *fopen(const char *path,const char *mode);
头文件:STDIO.H
函数作用:以指定文件路径和一定的模式打开一个文件。
形参:
path:所打开的文件路径,如果是当前工作目录下的文件,可以不用加路径名,如果是其他目录下的则需要加路径。
mode:打开模式
返回值:打开成功,返回指向这个打开的文件流指针(文件描述符(FILE * ));$不成功,返回NULL。
mode:模式
r :只读的方式打开文件,光标定位在文件开头
r+:读写的方式打开文件,光标定位在文件开头
w:清空写
如果文件存在,截取长度为0,如果文件不存在,创建文件,只写的方式打开,光标定位在文件开头
w+:(清空读写)读写的方式,如果文件存在,截取长度为0,如果文件不存在,创建文件,读写的方式打开,光标定位在文件开头。
a:追加写 - 光标在文件末尾
文件存在:追加写
文件不存在:创建文件
a+:读写
根据你第一次的操作,确定光标位置:
第一次是读:光标在文件开头
第一次是写:光标在文件末尾。
2)文件的关闭
fclose();
函数原型:int fclose (FILE *stream);
头文件:STDIO.H
函数作用:关闭已打开的文件流。
形参:
stream:文件流
返回值:关闭成功,返回0;$如果出现任何错误,返回非零。
3)单字符读写
getchar():从键盘获取一个字符
函数原型:#define getchar() getc(stdin)
头文件:STDIO.H
函数作用:从标准输入流中读取一个字符。
形参:无
返回值:返回读取的字符。
putchar():输出字符到屏幕上
函数原型:#define putchar(c) putc((c), stdout)
头文件:STDIO.H
函数作用:向标准输出流中写入一个字符.
形参:
c:需要写入的字符
返回值:返回写入到标准输出流中的字符.
fputc():向文件中写入单个字符
函数原型:int fputc(int c, FILE *stream);
头文件:STDIO.H
函数作用:向文件流的当前位置写入一个字符。
形参:
c:字符的ASCII码
stream:文件流指针
返回值:返回写入的字符。
fgetc():从文件中读取单个字符
函数原型:int fgetc(FILE *stream);
头文件:STDIO.H
函数作用:从文件流(stream)读一个字符。
形参:
stream:文件流指针
返回值:返回正确读取的字符。
4)字符串读写
fputs:写入到文件中
函数原型:int fputs(const char *s, FILE *stream);
头文件:STDIO.H
函数作用:向文件流的当前位置写入一字符串。
形参:
s:需要写入的字符串
stream:文件流指针
返回值:返回最后一个被输出到文件流中的字符;$如果没有数据输出到文件流,则返回0。
fgets:从文件中读取
函数原型:char *fgets (char *s, int n, FILE *stream);
头文件:STDIO.H
函数作用:从文件流中读取一个字符串。
形参:
s:存储读取的字符串的空间
n:读取字符的个数(个数中包含一个结束符(' ')),也就真正从文件流中读取的字符的个数就是n-1个。
stream:文件流指针
返回值:成功,返回读取的字符串。$不成功,返回NULL。
5)按块读写
fread():从文件中读取数据
函数原型:size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
头文件:STDIO.H
函数作用:fread 从文件流 stream 中读取 nmemb 个元素,写到 ptr 指向的内存中,每个元素的大小为 size 个字节。。
形参:
ptr:读取的数据的存储空间地址
size:每个元素的大小
n:读取的元素的个数(读取的次数)
stream:文件流指针(文件描述符(FILE * ))
返回值:返回读取的数据块的元素的个数。
fwrite():向文件中写入数据
函数原型:size_t fwrite(const void *ptr, size_t size, size_t n,FILE *stream);
头文件:STDIO.H
函数作用: fwrite 从 ptr 指向的内存中读取 nmemb 个元素,写到文件流 stream 中,每个元素 size 个字节。
ptr:需要写入到文件流中的数据块
size:数据块的组成元素的大小
n:数据块的元素个数(写入的次数)
stream:文件流指针(文件描述符(FILE * ))
返回值:返回写入的数据块的元素的个数。
6)格式化读写
fprintf():格式化的写入到文件
函数原型:int fprintf(FILE *stream, const char *format, ...);
头文件:STDIO.H
函数作用:向文件流写入格式化信息 。
形参:
stream:文件流
format:格式化字符串
... :可变参数,指明需要格式的数据
返回值:返回已经写入的字符数,出现错误返回EOF。
fscanf():格式化从文件中读取
函数原型:int fscanf(FILE *stream, const char *format, ...);
头文件:STDIO.H
函数作用:从文件流中格式化获取数据。
形参:
stream:文件流指针
format:格式化字符串
... :可变参数,指明需要格式的数据
返回值:返回可变参数中的正确获取数据的参数个数。
7)文件偏移操作
rewind():光标偏移到开头
函数原型:void rewind (FILE *stream);
头文件:STDIO.H
函数作用:将文件指针移动至文件开头位置。
形参:
stream:文件流指针
返回值:无
fseek():
函数原型:int fseek (FILE *stream, long offset, int whence);
头文件:STDIO.H
函数作用:将文件指针指向whence所指位置的向后offset个字节处。
形参:
stream:文件流指针
whence:指定的位置
文件头 0(SEEK_SET),
当前位置 1(SEEK_CUR),
文件尾 2(SEEK_END))为基准
offset:与whence的偏移量
+往文件末尾方向偏移
-往文件开头方向偏移
返回值:成功,返回0;$不成功,返回-1。
ftell():返回指针的位置,可以计算文件开头到光标处的偏移量
函数原型:long ftell(FILE *stream);
头文件:STDIO.H
函数作用:获得文件指针在文件流中的位置。
形参:
stream:文件流指针
返回值:返回从文件的开头到文件指针所在的位置之间间隔的字节数。
8)输出错误
perror():输出错误的信息
函数原型:void perror(const char *s);
头文件:STDIO.H
函数作用:打印一条标准错误流中的一条错误信息:错误信息的标题由s指定,然后打印冒号,接着打印当前errno数值相对应的错误消息,最后打印换行符。
形参:
s:错误标题
返回值:无
9)其他
feof():判断是否到达文件末尾
函数原型:int feof(FILE *stream);
形参:stream文件描述符
返回值:到达文件末尾返回非0,没有到达文件末尾返回0;
注意:feof在判断是否到达文件末尾,用的是前一次读到的结果来判断。
6.非缓冲区的文件操作
1)文件的打开
open():打开一个文件
函数原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
头文件:
#include
#include
#include
函数作用:打开一个文件。
形参:
const char *pathname:打开文件
int flags:打开的方式
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:读写
O_CREAT:假如文件不存在则新建
O_APPEND:追加
假如要以只写的方式打开文件,并且假如文件不存在则新建
open(“./1.tex”,O_WRONLY|O_CREAT,0664);
mode_t mode:权限 一般是配合O_CREAT使用的,他实际得到的权限是减去掩码的值(八进制数:0777)
查看掩码 umask
修改掩码的值 umask 0000
返回值:成功返回文件的描述符(一个int型整数)
失败返回 -1
2)文件关闭
close():
函数原型:int close(int fd);
头文件:#include
函数作用:关闭文件。
形参:
fd:文件的描述符
返回值:成功返回 0
失败返回 -1
3)文件的读
read();
函数原型:ssize_t read(int fd, void *buf, size_t count);
头文件:#include
函数作用:从打开的文件里读取内容
形参:
int fd:打开的文件的描述符
void *buf:读取到的内容存放的位置
size_t count:要读取的字节数
返回值:成功返回读到的字节数
失败 返回 -1
4)文件的写
write();
函数原型:ssize_t write(int fd, const void *buf, size_t count)
头文件:#include
函数作用:向一个已打开的文件写入内容
形参:
int fd:打开的文件的描述符
const void *buf:要写入的内容
size_t count:要写入的字节数
返回值:成功返回 成功写入的字节数
失败返回 -1
5)指针定位
lseek();
函数原型:off_t lseek(int fd, off_t offset, int whence);
头文件:#include
函数作用:重新定位文件的读写指针的位置
形参:
int fd:打开的文件的描述符
off_t offset:偏移量 可正可负
int whence:参考位置
SEEK_SET :文件的开头
SEEK_CUR:当前的位置
SEEK_END:文件的末尾
返回值:
成功返回指针距离文件头的距离
失败返回 -1



