文件的分类:文本文件、二进制文件
文本文件中,保存的时候一个字符对应一个字节;
二进制文件,按照二进制编码保存的文件。
用 vs 或者 Dev-C++ 使用 fopen等函数时,如果遇到打开不了的情况,例如:
可以在预定义时,在头文件前加上:#define _CRT_SECURE_NO_WARNINGS
fopen 函数打开文件,执行操作。
文件一旦使用完毕,应该用 fclose 函数把文件关闭,以释放相关资源,避免数据丢失。
不了解函数时,用鼠标点击该函数,按 Fn 键+ F1键。
FILE* fopen (char const* _FileName,char const* _Mode);
语法(filename 文件名、mode 类型)
文件打开:
FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "r");
验证是否打开:
if (fp == NULL)printf("打开失败");
如果 filename 或 mode 是 NULL 或空字符串,这些函数则会触发无效的参数处理程序,如 Parameter Validation。 如果允许执行继续,则这些函数将返回 NUll 并将 errno 设置为EINVAL。
二进制读写:rb、wb、ab、rb+、wb+、ab+. 与上文对应(只不过适用于二进制文件)。
//一个一个输出char ch=0;if (fp != 0){ch=fgetc(fp);printf("%c",ch);ch=fgetc(fp);printf("%c",ch);}
//循环全部输出while (fp!=0&&EOF!=(ch = fgetc(fp))){printf("%c", ch);}
从指定的流中读取数据,每次读取一行。
char *fgets(char *str,int n,FILE *stream);
//输出文件的第一行,接着输出第二行,同理输出第三行char str[200];if (fp != 0){fgets(str, 200, fp);printf("%s\n", ch);fgets(str, 200, fp);printf("%s\n", 200, fp);}
char str[200];//循环输出每一行while (fgets(str, 100, fp)){printf("%s", str);}
从开头读起,读取结束时,文件指针会自动移动到读取结束的地方。
语法 (buffer 数据的存储位置 / size 项目大小,以字节为单位 / count 要读取的项的最大数量 / stream 指向 FILE
结构的指针)
//返回实际读取的大小char str[200]={0};int n = fread(str, 1, 20, fp);str[n] = '\0';printf("%s\n", str);
//按字符个数输入,如果文件里面没有空格,循环结束char str[100] = { 0 };while (fread(str, 1, 100, fp)){printf("%s", str);}
FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "w");
语法( c 要写入的字符 / stream 指向 FILE
结构的指针)
//写一个字符,清空之后写FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "w");fputc( 'A',fp );fputc('B', fp);fputc('C', fp);
char str[] = "sddguerghieruuuuuufhdkhvkshgr";fputs(str, fp);fputs(str, fp);fclose(fp);
语法( butter 指向要写入的数据的指针/ size 项大小,以字节为单位 / count 要写入的项的最大数量 / stream 指向 FILE
结构的指针)
int num = 456123;fwrite(&num, sizeof(num), 1, fp);
也可以定义结构体,这样用:
struct node
{char name[10];char sex[10];
};
struct node p = { "张三","男" };fwrite(&p, 1, sizeof(p), fp);
如果要读写内容的话,可以在打开文件时使用 w+ 或者 r+,但是读完数据之后,不能直接写出来,因为文件的指针(光标)在最后面,此时是写不出来的。
那么就需要重置指针到文件开头,用 rewind 函数。
例:
FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "w+");//存入并输出A-Zfor(int i=0;i<26;i++){int ret=fputc('A'+i,fp);printf("%c",ret);}printf("\n");//接下来接着读取int ch=fgetc(fp);printf("%c",ch);fclose(fp);
按照这个代码的思路是:第一步输出二十六个字母之后,换行,接着第二步读取文件的值,但是第二步没有实现,因为在执行完第一个操作后,文件的指针在最后,再往后走是读不到字符的,此时用 rewind 函数,重置指针,就可以接着从文件头开始读取了。
只需要改一个地方,在第二步开始之前加入:
rewind(fp);
是一个非常方便的文件读取函数,可以设置文件指针到指定位置。
语法( stream 指向 FILE
结构的指针 / offset origin
中的字节数 / origin 初始位置)
可以将文件开头数的第十位字符输出
char str[200] = { 0 };fseek(fp, 10, SEEK_SET);//开头开始读fread(str, 1, 100, fp);printf("%s\n", str);
从指针当前位置倒退十个字符
char str[100] = { 0 };//初始化fseek(fp, -10, SEEK_CUR);fread(str, 1, 100, fp);printf("%s\n", str);