2020.10.31 17课 文件操作以及函数

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系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。

2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以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);
	//字符串最后是\0
   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\n",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\n", 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\n", &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\n", 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\n %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))
while (fread(&buf, 1, sizeof(buf), p))

1.10 *通过fwrite将结构保存到二进制文件中*

做一个代码例子

1.12 *ftell函数*

函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。

1.13 *fflush函数*

fflush函数可以将缓冲区中任何未写入的数据写入文件中。

成功返回0,失败返回EOF。

int fflush(FILE * _File);

![img](file:///C:\Users\鹤儿\AppData\Local\Temp\ksohtml28796\wps2.jpg)

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下文件名与路径可以用反斜杠\分隔,也可以用斜杠/分隔。

posted @ 2020-11-26 09:13  鹤儿哈  阅读(115)  评论(0编辑  收藏  举报