1 *文件操作*
1.33
三部分组成:文件路径,文件名主干,文件后缀****
1.1 *fopen*
FILE* file=fopen("文件路径",“打开方式”);****
/文件指针 FILE*
//打开文件 fopen("文件路径","打开方式");
//打开方式:
/* 文件不存在
r 只读方式,用这个方式打开的文件就只能读,不能修改 出错
w 只写 新建文件
b 以二进制方式打开 出错
+通常是和其他的打开方式组合一起使用 r+可读写
a 追加文件内容,在文件末尾追加 新建文件
r 以只读方式打开文件,该文件必须存在。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。
rw+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
1.2 *二进制和文本模式的区别*
1.在windows系统中,文本模式下,文件以" "代表换行。若以文本模式打开文件,并用fputs等函数写入换行符" "时,函数会自动在" "前面加上" "。即实际写入文件的是" " 。
2.在类Unix/Linux系统中文本模式下,文件以" "代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。
1.3 *fclose*
fclose关闭fopen打开的文件
fclose(file);
1.4 *fgetc和fgets函数*
fgetc(文件指针);会有一个返回值是int类型,读取一个字符
FILE* file=fopen(“1.txt”,"r");
char ch= fgetc(file);
printf("%d",ch);
fclose(file);
//从已经建立好的1.txt中得到一个字符
fgts
FILE* file=fopen(“1.txt”,"r");
char str[100] = { "0" };
fgets(str, 19, file);
//字符串最后是
printf("%d”,str);
fclose(file);
1.5 *EOF与feof函数文件结尾*
feof(文件指针);判断文件指针是否指向文件末尾,到了文件末尾返回值是1
FILE* file=fopen(“1.txt”,"r");
char str[1024]={0};
int i=0;
while(!feof(file)){
str[i++]=fgetc(file);
}
printf("%s
",str);
fclose(file);
UTF-8 控制台显示会乱码,改为ANSI
简体中文GB2312
程序怎么才能知道是否已经到达文件结尾了呢?EOF代表文件结尾
如果已经是文件尾,feof函数返回true。
1.6 *fputs函数*与fprintfy与fscanf函数
fputs(char* ,文件指针);写入一个字符串
FILE* file=fopen(“1.txt”,"w"); //得是w写入
char str[]="哈哈哈";
fputs(str,file);
fclose(file);
fprintf(文件指针,“格式占位符”,变量);
就会把一些数据,int double 的变量写到文本中去
从磁盘文件中按格式输出字符
typedef struct node {
int id;
char name[20];
int age;
char sex[10];
}NODE;
NODE mynode[6] = {
{1,"fei",18,"nv"},
{2,"fei",18,"nv"},
{3,"fei",18,"nv"},
{4,"fei",18,"nv"},
{5,"fei",180,"nv"},
{6,"sunhe",18,"nan"}
};
void print() {
FILE* file = fopen("7.txt", "w");
for (int i = 0; i < 6; i++)
{
fprintf(file, "id:%d 姓名:%s 年龄:%d 性别:%s
", mynode[i].id, mynode[i].name, mynode[i].age, mynode[i].sex);
}
fclose(file);
}
fscanf 从磁盘文件中按格式读入字符
void read() {
NODE n[5] = { 0 };
FILE* file = fopen("7.txt", "r");
for (int i = 0; i <7; i++) {
fscanf(file, "id:%d 姓名:%s 年龄:%d 性别:%s
", &mynode[i].id, mynode[i].name, &mynode[i].age,mynode[i].sex); //int类型首地址要&,数组名就是指针
}
for (size_t i = 0; i <6; i++)
{
printf( "id:%d 姓名:%s 年龄:%d 性别:%s
", mynode[i].id, mynode[i].name, mynode[i].age, mynode[i].sex);
}
这些函数都是通过FILE *来对文件进行读写。
都是针对文本文件的行读写函数。
**1.7 *fseek函数*
fseek(文件指针,int,起始点);//移动文件指针
int:正数表示这个文件指针从起始点往后移动,负数就是往前移动
起始点 0 文件开始的位置
1 文件指针当前的位置
2文件末尾的位置
FILE* file = fopen("10.txt", "r");
fseek(file, 3, 0);
char str = fgetc(file);
fseek(file, 1, 1);
char str1 = fgetc(file);
printf("%c
%c", str, str1);
int fseek(FILE * _File, long _Offset, int _Origin);
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败则不改变stream指向的位置,函数返回一个非0值。
实验得出,超出文件末尾位置,还是返回0。往回偏移超出首位置,还是返回0,请小心使用。
第一个参数stream为文件指针
第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
1.8图片jpg转为pack 打包
ftell(指针)获取文件指针的偏移量
FILE* file1 = fopen("9.jpg", "rb");
FILE* file2 = fopen("10.pack", "wb");
while (!feof(file1)) {
fputc(fgetc(file1), file2);
}
pack字节数比jpg多一个字节
FILE* file1 = fopen("9.jpg", "rb");
FILE* file2 = fopen("10.pack", "wb");
fseek(file1,0,2);//从文件开头移动到文件末尾
int x=ftell(file1)//ftell获取文件指针的偏移量 文件多少个字节大小
printf("%d", x);
fseek(file1, 0, 0);//再移动到文件开头
for (int i = 0; i < x; i++)
{
fputc(getc(file1), file2);
}
//这样做的效果是字节数相等
1.9fwrite和fread函数
fwrite(void**buff,类型大小elementsize,个数elementcount,FILE*_stream);
要写入文本的变量的首地址,比如要写入一个int类型变量,要写入多少个上面哪个类型大小的元素,文件指针
FILE* file = fopen("12345.txt", "wb");
int sum = 1235645;
fwrite(&sum, sizeof(int), 1, file);
fclose(file);
建了一个文本,打开里面是二进制显示的
fread(&sum, sizeof(int), 1, file);
FILE* file = fopen("12345.txt", "rb");//这里改成只读二进制
int sum = 0;//初始化为0
fread(&sum, sizeof(int), 1, file);
printf("%d",sum);
fclose(file);
以二进制的方式读写数据
1.7 *stat函数*
#include <sys/stat .h>
int stat(const char * _Filename, struct stat * _Stat)
stat.st_size;//文件大小,单位:字节
函数的第一个参数代表文件名,第二个参数是struct stat结构。
得到文件的属性,包括文件建立时间,文件大小等信息。
1.8 *fread和fwrite函数*
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
返回值:返回实际写入的数据块数目
1.9 *fread与feof*
注意以下两段代码的区别
while (!feof(p)) { fread(&buf, 1, sizeof(buf), p); } |
---|
while (fread(&buf, 1, sizeof(buf), p)) |
1.10 *通过fwrite将结构保存到二进制文件中*
做一个代码例子
1.12 *ftell函数*
函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。
1.13 *fflush函数*
fflush函数可以将缓冲区中任何未写入的数据写入文件中。
成功返回0,失败返回EOF。
int fflush(FILE * _File);

1.14 *remove函数*
remove函数删除指定文件
int remove(const char *_Filename);
参数Filename为指定的要删除的文件名,如果是windows下文件名与路径可以用反斜杠分隔,也可以用斜杠/分隔
1.15 *rename函数*
rename函数将指定文件改名
int rename(const char *_OldFilename,const char *_NewFilename);
参数oleFilename为指定的要修改的文件名,newfilename为修改后的文件名,如果是windows下文件名与路径可以用反斜杠分隔,也可以用斜杠/分隔。