概述
什么是 文件
文件时保存在外存储器上(一般代指磁盘,也可以是U盘、移动硬盘等)的数据的集合。
文件操作体现在哪几个方面
1. 文件内容的读取
2. 文件内容的写入
数据的读取和写入可被视为针对文件进行输入和输出的操作,此时数据就像水流一样从外存
储器流向内存,或者从内存流向外存储器,所以系统形象的称文件操作为文件流。
C语言程序对文件的操作采用“文件缓冲机制”。就是说在程序中对文件的数据读写并不是直接
操作文件中的数据,而是系统会为文件在内存中创建“文件缓冲区”,程序对文件的操作,其实是在
缓冲区进行的。
文件的分类
根据数据的存储方式划分:
1. 文本文件(ASCII文件)
2. 二进制文件
文件标识
1. 文件系统中:路径+文件名,举例: d:/aaa/bbb.txt
2. C语言程序中:文件指针(文件类型指针),语法: FILE *指针变量名
文件操作的步骤:
1. 打开文件
2. 文件处理(读写文件)
3. 关闭文件
文件的操作
文件的打开与关闭
打开文件,让系统为文件创建文件缓冲区;
函数名:fopen
头文件: #include <stdio.h>
函数原型: FILE* fopen(const char *path,const char *mode);
函数功能:打开文件,并为文件创建缓冲区
函数参数:
path:目标文件的路径
mode:文件打开的方式(读-r、写-w、读写-rw)
返回值:
成功:返回文件指针 File* (缓冲区首地址)
失败:返回NULL
文件关闭,文件使用完毕,一定要记得释放
函数名:fclose
头文件: #include <stdio.h>
函数原型: int fclose(FILE* fp);
函数功能:关闭文件,释放缓冲区
函数参数:
fp:已经打开的文件指针
返回值:
成功:返回0
失败:返回EOF(-1)
文件打开与关闭案例
/**
* 文件的打开与关闭
*/
#include <stdio.h>
int main(int argc,char** argv)
{
// 在命令行执行./a.out的时候,传递一个需要打开的目标文件的地址
if(argc < 2)
{
printf("输入有误,请按照<%s 文件路径>格式输入\n",argv[0]);
return -1;
}
// 根据提供的文件路径,打开文件,mode(r,w,rw)
FILE* fp = fopen(argv[1],"r");
// 校验文件是否读取成功
if(!fp)
{
perror("文件打开失败!");
return -1;
}
puts("文件打开成功!");
// 关闭打开的文件
int ret = fclose(fp);
// 校验文件是否关闭成功(很多时候这一步会省略掉)
if(ret == -1)
{
perror("文件关闭失败!");
return -1;
}
puts("文件关闭成功!");
return 0;
}
文件的读写
单字符读取
函数名:fgets
头文件: #include <stdio.h>
函数原型: int fgets(File* fp);
函数功能:从fp代表的文件中获取一个字符
函数参数:
fp:我们需要操作的文件的描述
返回值:
成功:返回读取到的字符
失败:或者文件末尾,返回EOF(-1)
方式1:
/**
* 单字符的读取
*/
#include <stdio.h>
int main(int argc,char **argv)
{
if(argc < 2)
{
printf("输入有误,请按照<%s 文件路径>格式输入\n",argv[0]);
return -1;
}
// 打开文件
FILE* fp = fopen(argv[1],"r");
// 非空校验
if(!fp)
{
perror("文件打开失败!");
return -1;
}
// 单字符读取文件
int re = 0;
while(re != -1 && re != '\n')
{
re = fgetc(fp);
printf("%c",re);
}
printf("\n");
// 关闭文件
fclose(fp);
return 0;
}
方式2:
/**
* 单字符读取
*/
#include <stdio.h>
int main(int argc,char **argv)
{
// 获取外部输入
if(argc < 2)
{
printf("输入有误,请按照<%s 文件路径>格式输入\n",argv[0]);
return -1;
}
// 打开文件
FILE* fp = fopen(argv[1],"r");
if(!fp)
{
perror("文件打开失败!");
return -1;
}
// 读取文件
char ch;
while((ch = fgetc(fp)) != EOF)
{
printf("%c",ch);
}
printf("\n");
// 关闭文件
fclose(fp);
return 0;
}
多字符读取
函数名:fgets()
头文件: #include <stdio.h>
函数原型: char *fgets(char *buf, int size, FILE *fp);
函数功能:从fp代表的文件中获取size -1个字符,放置在buf代表的内存中
函数参数:
buf:内存空间首地址用于存放读取的字节
size:待读取的字符,实际读取size -1
fp:已经打开的文件指针
返回值:
成功:返回buf
失败:文件末尾,返回NULL
案例:
/**
* 多字符读取
*/
#include <stdio.h>
#include <string.h>
int main(int argc,char **argv)
{
if(argc < 2)
{
printf("输入有误,请按照<%s 文件路径>格式输入\n",argv[0]);
return -1;
}
FILE* fp = fopen(argv[1],"rw");
if(!fp)
{
perror("文件打开失败!");
return -1;
}
// 多字符读取
// 创建缓冲区大小
char buf[64] = {0};
while(fgets(buf,64,fp)!=NULL)
{
printf("%s",buf);
// 给buf赋初始值
memset(buf,0,sizeof(buf));
}
printf("\n");
fclose(fp);
return 0;
}
单字符写入
函数名:fputc
头文件: #include <stdio.h>
函数原型: int fputc(int c,FILE* fp)
函数功能:向fp代表的文件中写入一个字符c
函数参数:
c:待写入的字符
fp:已打开的文件指针
返回值:
成功:返回字符c
失败:返回EOF(-1)
案例:
/**
* 单字符写入
*/
#include <stdio.h>
int main(int argc,char **argv)
{
if(argc < 3)
{
printf("输入有误,请按照<%s 文件路径 文本数据>格式输入\n",argv[0]);
return -1;
}
FILE* fp = fopen(argv[1],"w");
if(!fp)
{
perror("文件打开失败!");
return -1;
}
// 单字符写入
while(*argv[2] != '\0')
{
// ./a.out file1.txt I_Love_Your
fputc(*argv[2],fp);
argv[2]++;// 指针偏移1位
}
fclose(fp);
return 0;
}
多字符写入
函数名:fputs
头文件: #include <stdio.h>
函数原型: int fputs(const char *s, FILE *stream);
函数功能:向fp代表的文件中写入一个字符数组s
函数参数:
s:待写入的字符数组(写入缓冲区)
fp:已打开的文件指针
返回值:
成功:返回非负整数 (> 0)
失败:返回EOF(-1)
案例:
/**
* 多字符写入
*/
#include <stdio.h>
int main(int argc,char **argv)
{
if(argc < 3)
{
printf("输入有误,请按照<%s 文件路径 文本数据>格式输入\n",argv[0]);
return -1;
}
FILE* fp = fopen(argv[1],"w");
if(!fp)
{
perror("文件打开失败!");
return -1;
}
// 单字符写入
// ./a.out file1.txt I_Love_Your
fputs(argv[2],fp);
fclose(fp);
return 0;
}