文件的分类:
文本文件: 储存的是ASCII码值的二进制
二进制文件:储存的是数据的补码
文件IO:
FILE *fopen(const char *path, const char *mode);
功能:打开或者创建文件
path:文件的路径
mode:打开模式
r 以只读权限打开文件,如果该文件不存在,则打开失败,返回空指针
FILE* frp = fopen("./test.txt","r");
if(NULL == frp)
{
prrror("fopen");// 只有系统函数可以使用
}
r+ 在 r 的基础上,增加写权限,如果不存在,依然不能打开
w 以只写权限打开文件,如果文件不存在则创建,如果文件存在则会清空
w+ 在 w 的基础上,增加读权限
a 以追加的形式打开文件,如果文件不存在则新建,如果文件存在则不清空,新写入的数据会在文件的末尾
a+ 在 a 的基础上,增加读权限
注意:以上方式打开文件都是以文本文件形式来操作文件的,在它们的基础加上b
返回值:结构指针,不需要关心它的成员,只需要知道它是操作该文件的唯一凭证
二进制形式的读写:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从内存中把数据写入到文件中
ptr: 要写入的内存的首地址
size: 一次写入的字节数
nmemb: 写入多少次
FILE*: 文件指针,fopen的返回值
返回值:成功写入的次数
{
FILE* fwp = fopen("./test.txt","w");
if(NULL == fwp)
{
perror("fopen");
return 1;
}
char str[] = "haa";
fwrite(str,1,strlen(str),fwp);
}
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从文件中读取数据到内存中
ptr:要读取到内存的首地址
size:每次读取多少个字节
nmemb:读取多少次
FILE*:文件指针
返回值:成功读取到的次数
{
FILE* frp = fopen("./test.txt","r");
if(NULL == frp)
{
perror("fopen");
return 1;
}
char buf[255] = {};
fread(buf,1,255,frp);
printf("%s\n",buf);
}
文本形式的读写:
int fprintf(FILE *stream, const char *format, …);
功能:以文本形式写入数据到文件中
stream:要写入的文件指针
format:占位符…
…:变量列表
返回值:成功写入的字符个数
int fscanf(FILE *stream, const char *format, …);
功能:以文本形式从文件中读取数据到内存中
stream:要写入的文件指针
format:占位符…
…:变量列表的地址
返回值:成功读取到的变量的个数
int fclose(FILE *fp);
功能:关闭文件(因为有缓冲区的存在,想要立即写入到文件,关闭一下文件)
文件位置指针:
每个打开的文件都会有一个文件位置指针指向要读写的位置,它会随着文件的读写而移动,以r、r+、w、w+模式打开文件,文件位置指针会在文件的开头,以a\a+打开,文件位置指针会在文件的末尾
int fseek(FILE *stream, long offset, int whence);
功能:设置文件的位置指针
stream:要设置的文件指针
offset:偏移值
whence:基础位置
SEEK_SET:文件的开头
SEEK_CUR: 文件指针的当前位置
SEEK_END: 文件的末尾 返回值:成功返回0,失败返回-1
void rewind(FILE *stream);
功能:把文件位置指针设置到文件开头
long ftell(FILE *stream);
功能:获取文件位置指针当前所在的位置 返回:所在第几个字节
int feof(FILE *stream);
功能:检查文件位置指针是否已经到达末尾 返回值:如果到达末尾返回非零值
char *fgets(char *s, int size, FILE *stream);
功能:从文件中读取一行字符串
int fputs(const char *s, FILE *stream);
功能:写入一个字符串到文件中,会自动添加\n在末尾
int fgetc(FILE *stream);
功能:从文件中读取一个字符
int fputc(int c, FILE *stream);
功能:写入一个字符到文件中
int remove(const char *pathname);
功能:删除一个文件 返回值:成功返回0,失败返回-1
int rename(const char *oldpath, const char *newpath);
功能:重命名文件 返回值:成功返回0,失败返回-1
main函数的参数:
是为了获取命令行的参数
argc 代表了命令行参数的总个数
argv 代表了每个参数字符串的首地址
练习:定义一个教师的结构体变量并初始化,把该变量以二进制形式写入到文件中
#include <stdio.h>
#include "i.h"
int main(int argc,const char* argv[])
{
Teacher tch = {"张老师",'w',10,12345};
FILE* fwp = fopen("./tch.bin","w");
if(NULL == fwp)
{
perror("fopen");
return 1;
}
fwrite(&tch,sizeof(Teacher),1,fwp);
return 0;
}
练习:从文件中读取教师结构体变量到内存中显示。
#include <stdio.h>
#include "i.h"
int main(int argc,const char* argv[])
{
Teacher tch = {};
FILE* frp = fopen("./tch.bin","r");
if(NULL == frp)
{
perror("fopen");
return 1;
}
fread(&tch,sizeof(Teacher),1,frp);
printf("%s %c %hhd %d\n",tch.name,tch.sex,tch.wage,tch.id);
}
练习:定义一个教师的结构体变量并初始化,把该变量以文本形式写入到文件中
#include <stdio.h>
#include "i.h"
int main(int argc,const char* argv[])
{
Teacher tch = {"张老师",'w',10,12334};
FILE* fwp = fopen("./test1.txt","w");
if(NULL == fwp)
{
perror("fopen");
return 1;
}
fprintf(fwp,"%s %c %hhd %d",tch.name,tch.sex,tch.wage,tch.id);
}
练习:从文件中以文本文件读取教师结构体变量到内存中显示。
#include <stdio.h>
#include "i.h"
int main(int argc,const char* argv[])
{
Teacher tch = {};
FILE* frp = fopen("./test1.txt","r");
if(NULL == frp)
{
perror("fopen");
return 1;
}
fscanf(frp,"%s %c %hhd %d",tch.name,&tch.sex,&tch.wage,&tch.id);
printf("%s %c %hhd %d",tch.name,tch.sex,tch.wage,tch.id);
}
练习5:实现cp命令的功能
#include <stdio.h>
int main(int argc,const char* argv[])
{
if(argc != 3)
{
printf("User :cp dest str\n");
return 0;
}
for(int i = 0; i<argc; i++)
{
printf("%s\n",argv[i]);
}
// 打开文件
FILE* frp = fopen(argv[1],"r");
if(NULL == frp)
{
perror("fopen");
return 0;
}
// 新建文件
FILE* fp = fopen(argv[2],"r");
if(fp)
{
perror("文件已存在,是否覆盖(y/n) ?");
char cmd = getchar();
if('y' != cmd && 'Y' != cmd)
{
printf("停止拷贝\n");
return 0;
}
fp = fopen(argv[2],"w");
}
else
{
fp = fopen(argv[2],"w");
}
if(NULL == fp)
{
printf("创建目标文件失败,请检查路径\n");
return 0;
}
// 边写边读,直到文件位置指针读到末尾
char buf[256] = {};
int ret = 0;
while(0 < (ret = fread(buf,1,sizeof(buf),frp)))
{
fwrite(buf,1,ret,fp);
}
// 关闭文件
fclose(frp);
fclose(fp);
frp = NULL;
fp = NULL;
}