11 文件
目录
11 文件
一、文件系统
二、文件操作方式
1、基于缓冲区文件操作
2、基于非缓冲区文件操作
三、文件操作的常用函数
1、fopen
2、fclose
3、fputc
4、fgetc
5、rewind
6、fseek
7、fputs
8、fgets
9、fwrite
10、fread
11、fprintf
12、fscanf
13、feof
14、ftell
实战:
一、文件系统
-
文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。
-
文件系统的基本数据单位是文件,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。
-- 文件形式:
-
ascall码形式存储
-
二进制文件流形式存储
二、文件操作方式
1、基于缓冲区文件操作
(1)运行内存<->缓冲区<->磁盘
(2)缓冲区:
-
标准输入缓冲区 --stdin
-
标准输出缓冲区 -- stdout
-
标准错误缓冲区 --stderr
2、基于非缓冲区文件操作
三、文件操作的常用函数
1、fopen
函数功能:打开文件
函数头文件:#include<stdio.h>
函数原型:FILE *fopen(const char *pathname,const hcar *mode);
函数参数:
-
pathname:要打开的文件名称 -- 路径/文件 -- 字符串形式
-
mode:打开文件的模式 --字符串形式
1. r -- 只读,若文件不存在,报错
2. w -- 只写,若文件存在,覆盖,若文件不存在,创建文件
3. a -- 追加,若文件存在,在文件末尾追加,若文件不存在,创建文件
6. a+,r+,w+ -- 读写操作,依然保留原特性
函数返回值:
- 打开的文件描述指针 -- FILE *
#include "stdio.h"int main(int argc, char const *argv[])
{if(argc<=1){printf("未填写目标文件!\n");}FILE *fp = fopen(argv[1],"w");if(fp == NULL){perror("fopen");return 0;}printf("文件打开成功!\n");return 0;
}
2、fclose
函数功能:关闭文件
函数头文件:#include<stdio.h>
函数原型:int fclose(FILE *stream);
函数参数:
- stream --要关闭的文件指针
函数返回值:成功返回0,失败返回-1
#include "stdio.h"int main(int argc, char const *argv[])
{if(argc<=1){printf("未填写目标文件!\n");}FILE *fp = fopen(argv[1],"w");if(fp == NULL){perror("fopen");return 0;}printf("文件打开成功!\n");int res = 1;res = fclose(fp);if(res){perror("fclose");return 0;}printf("文件关闭成功!\n");return 0;
}
3、fputc
函数功能:向文件写入一个字符
函数头文件:#include<stdio.h>
函数原型:int fputc(int c,FILE *stream);
函数参数:
-
c -- 要写入的字符
-
stream -- 要写入的文件指针
函数返回值:成功返回写入的字符,失败返回EOF
4、fgetc
函数功能:从文件读取一个字符到程序中
函数头文件:#include<stdio.h>
函数原型:int fgetc(FILE *stream);
函数参数:
- stream -- 要读取的文件指针
函数返回值:
-- 返回读取的字符内容
5、rewind
函数功能:移动光标到首位
函数头文件:#include<stdio.h>
函数原型:void rewind(FILE *stream);
函数参数:
- stream -- 文件指针
函数返回值:无
6、fseek
函数功能:移动光标到指定位置
函数头文件:#include<stdio.h>
函数原型:int fseek(FILE *stream,long offset,int whence);
函数参数:
-
stream -- 文件指针
-
offset -- 指针偏移量 -- 正数:向右偏移 负数:向左偏移
-
whence -- 指针位置
1.SEEK_SET -- 文件开头
2.SEEK_CUR -- 文件当前位置
3.SEEK_END -- 文件末尾
函数返回值:成功返回0,失败返回-1
注:这些宏定义其实就是枚举,他们也可写成0,1,2。
7、fputs
函数功能:向文件写入一个字符串
函数头文件:#include<stdio.h>
函数原型:int fputs(const char *s,FILE *stream);
函数参数:
-
s -- 要写入的字符串
-
stream -- 要写入的文件指针
函数返回值:成功返回0,失败返回-1
8、fgets
函数功能:从文件读取一个字符串到程序中
函数头文件:#include<stdio.h>
函数原型:char *fgets(char *s,int size,FILE *stream);
函数参数:
-
s -- 要读取的字符串存放地址
-
size -- 要读取的字符长度
-
stream -- 要读取的文件指针
函数返回值:
-- 返回读取的字符串存放地址
9、fwrite
函数功能:向文件中写入一块数据
函数头文件:#include<stdio.h>
函数原型:size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream);
函数参数:
-
ptr -- 要写入的数据首地址
-
size -- 要写入的字符长度
-
nmemb -- 要写入的块数
-
stream -- 文件指针
函数返回值:不用
注:这里的一块数据可以是字符串,数组,结构体等。
10、fread
函数功能:从文件读取一块字符串到程序中
函数头文件:#include<stdio.h>
函数原型:size_t fread(const void *ptr,size_t size,size_t nmemb,FILE *stream);
函数参数:
-
ptr -- 要读取的数据首地址
-
size -- 要读取的字符长度
-
nmemb -- 要读取的块数
-
stream -- 文件指针
函数返回值:不用
注:这里的一块数据可以是字符串,数组,结构体等。
11、fprintf
函数功能:向文件写入格式化字符串
函数头文件:#include<stdio.h>
函数原型:int fprintf(FILE *stream,const char *format,......);
函数参数:
-
stream -- 文件指针
-
format -- 格式化字符串 -- 写出的数据格式
-
...... -- 要写入的变量
函数返回值:不用
12、fscanf
函数功能:从文件读取格式化字符串
函数头文件:#include<stdio.h>
函数原型:int fscanf(FILE *stream,const char *format,......);
函数参数:
-
stream -- 文件指针
-
format -- 格式化字符串 -- 写入的数据格式
-
...... -- 要读取的变量
函数返回值:不用
13、feof
函数功能:判断文件是否到达末尾
函数头文件:#include<stdio.h>
函数原型:int feof(FILE *stream);
函数参数:
- stream -- 文件指针
函数返回值:
末尾 -- 1 不在末尾 -- 0
14、ftell
函数功能:获取光标位置 -- 若光标在
函数头文件:#include<stdio.h>
函数原型:long ftell(FILE *stream);
函数参数:
- stream -- 文件指针
函数返回值:
-- 光标距离首位的距离 -- 在末尾则表示文件的大小
实战:
重点掌握一下函数:
-
打开文件 -- fopen
-
写出文件内容 -- fwrite / fprintf(可以格式化写入,不会出现乱码)
-
移动光标位置 -- fseek
-
读取文件内容 -- fread/fscanf(可以格式化读出,不会出现乱码)
-
关闭文件 -- fclose
注:
先将文件打开,如果没有会自动创建,然后将文件内容写入,移动光标位置,读取文件内容,最后关闭文件。这里要移动光标的目的是在写完文件后,如果不重新打开文件,光标会停在文件末尾,这样读取文件内容时,读取不到任何东西。而重新打开后,光标就会移到文件的开头,但是这样太多复杂,可以直接用fseek来移动光标位置。
#include "stdio.h"int main(int argc, char const *argv[])
{if(argc<=1){printf("未填写目标文件!\n");}FILE *fp = fopen(argv[1],"w");if(fp == NULL){perror("fopen");return 0;}printf("文件打开成功!\n");//写char *str = "hello";fprintf(fp,"%s",str);//移动光标位置fseek(fp,0,SEEK_SET);//读fscanf(fp,"%s",str);printf("%s\n",str);int res = 1;res = fclose(fp);if(res){perror("fclose");return 0;}printf("文件关闭成功!\n");return 0;
}