目录
1.fopen:
2.fclose
3.fwrite
3.fread
4.fseek
2.系统调用文件接口
2.1open:
2.2write:
2.3read :
2.4lseek:
2.5close:
1.fopen:
FILE *fopen(const char *path, const char *mode);path :带有路径的文件名称,(如果不带有路径,打开的文件可以是在当前路径下)返回值:
成功:返回文件流指针 FILE*失败:返回NULL
| r |
只读模式打开文件流是指向了文件起始位置如果找不到要打开的文件则报错返回 |
|---|---|
| r+ |
以可读可写的方式打开文件流是指向了文件起始位置 |
| w |
当前文件如果存在,则截断(清空文件内容)文件当前文件不存在,则创建一 一个新文件 |
| w+ |
以可读可写的方式打开当前文件如果存在,则截断 (清空文件内容)文件当前文件不存在,则创建一 一个新文件 |
| a |
追加写如果当前文件不存在,则创建 文件如果当前文件存在,则将文件流指针指向文件末尾进行写。 |
| a+ |
可以读,也可以追加写如果文件不存在,则创建文件读的位置被初始化到文件的头,但是追 加的写的时候,从 文件的末尾开始追加 |
2.fclose
作用:关闭文件。在打开文件操作完成后要关闭文件,不然会造成句柄泄露,当句柄持续泄露的时候,最终进程就不能再打开新的文件了:内存泄漏,导致进程占用文件过多,如果持续泄漏,总有一个时刻,操作系统是没有办法满足进程申请内存资源的请求,操作系统就会强杀进程。
3.fwrite
size_ t fwrite(const void *ptf,size_ t size,size_ t nmemb, FILE *stream) ;参数:
ptr:想往文件当中写什么内容size:定义往文件当中写的时候,一个块是多大,单位是字节: (通常定义为一个字节)nmemb :期望写多少块stream:文件流指针返回值:
返回成功写入到文件块的个数验证一下:这里我们写入的块数设置为2,期望写入三块,但一共13个字符。运行后我们可以发现成功写入文件6个字节
3.fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);参数:
ptr:将从文件 当中读到的内容保存到ptr指向的内存空间当中size:定义从文件当中读的时候,一个块是多大,单位字节:(通常定义为一 个字节)nmemb :期望读多少块stream:文件流指针返回值:
返回成功读入的文件块的个数测试:
我们写一个fread测试一下,用size_t来接收返回值可以看到成功读取文件中七个块的内容我们再测试1
4.fseek
int fseek(FILE *stream, long offset, int whence);作用:
移动文件 流指针的位置参数:
stream:文件流指针offset :偏移量,我们的whence只能让文件流指针偏移到开头或者末尾,或者当前位置,但有了我们的stream。就可以让文件流指针指向文件开头的后offset位置,或者文件末尾后offset位置。当前位置的后offset位置whence :将文件流指针偏移到什么位置
SEEK_ SET:文件头部SEEK_ CUR:当前文件流指针的位置SEEK_ END: 文件末尾返回值:
成功:0失败:-1测试:我们来看一个现象我们让代码跑起来看结果我们发现文件中写入内容,但是并没有被读出来。这是因为当前文件流指针在文件内容的末尾,所以此时我们就要用到我fseek函数可以看到此时成功读取1
2.系统调用文件接口 2.1open:
int,open(const,char,*pathname, int ,flags);int,open( const,char,*pathname, int ,flags, mode_ t mode);参数:
pathname:要打开或创建的目标文件mode:当新创建一个文件的时候,指定 新创建文件的权限;传递一 个8进制的数字(就是权限,例如0664)flags:打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行"或"运算,构成flags。
O_ RDONLY: 只读打开O_ WRONLY:只写打开O_RDWR,:,读,写打开这三个常量,必须指定一个且只能指定一个O_ CREAT:若文件不存在,则创建它。需要使用mode选项, 来指明新文件的访问权限.O_ APPEND:, 追加写例如:我们想以可读可写,并且如果它不存在就创建它:可以输入参数
O_RDWR|O_CREAT(通过位图的方式运算的)返回值:
成功:新打开的文件描述符失败: -1测试:我们以读写的方式来打开一个文件,若不存在就创建它我们来运行一下,可以发现文件创建成功并且返回文件描述符为3(或者叫文件操作句柄,或者文件句柄)1
2.2write:
ssize_t write(int fd, const void *buf, size_ t count);参数:
fd:文件描述符buf:将buf指向的内容写到文件当中去count:期望写多少字节(这里并没有块的概念)返回值:
返回写入的字节数量。
2.3read :
ssize_t read(int fd, void *buf, size_ t count) ;参数:
fd:文件描述符buf:将从文件当中读到的内容写到buf指向的空间当中去count:期望读多少字节返回值:
返回读到的字节数量。
2.4、lseek:
off_t lseek(int fd, off_t offset, int whence);参数:
fd:文件描述符offset:.偏移量, 单位字节whence:偏移的位置
SEEK_ SET: 文件头部SEEK_ CUR:当前文件 流指针的位置SEEK_ END: 文件末尾返回值:
成功:返回偏移的位置,单位字节。失败: -1
2.5close:
int close(int fd);关闭文件描述符我们来测试一下这些系统调用函数我们可以看到成功读取成功写入隐藏bug:我们可以看到每次读取时我们都要对读取的内容小于当前要保存字符的数组的大小减一。这是因为:如果当我们读取文件内容时如果文件内的字符数大于或者等于我们保存读取到的内容的数组时,数组就会被文件中的内容充满,而没有预留“ ”的位置,如果这时我们要获取数组中的内容时,就会导致越界访问。从而导致程序崩溃
看到这里如果觉得有用不如点个赞再走吧!!!



