目录
1.文件指针
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。
FILE* pf;文件指针变量
ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件
2.文件的打开与关闭
FILE * fopen ( const char * filename, const char * mode );
filename文件名,mode打开文件的方式
绝对路径
int main()
{
//1.打开文件
FILE* pf =fopen("test.txt","r");
//判断失败,如果失败返回空
if (pf == NULL)
{
perror("fopen");
return 1;
}
//2.读文件
//3.关闭文件
fclose(pf);
pf = NULL;
return 0;
}
3.文件的顺序读写
fputc 字符输出函数
将字符串可以存到文件当中
int main()
{
//1.打开文件
FILE* pf = fopen("test.txt", "w");
//判断失败,如果失败返回空
if (pf == NULL)
{
perror("fopen");
return 1;
}
//2.写文件,输出操作
//写一个abcdef字符串
fputc('a',pf);
fputc('b', pf);
fputc('c', pf);
fputc('d', pf);
fputc('e', pf);
fputc('f', pf);
//3.关闭文件
fclose(pf);
pf = NULL;
return 0;
}
fgetc 字符输入函数
可以将文件中的数据字符串读取出来
int main()
{
//1.打开文件
FILE* pf = fopen("test.txt", "r");//只读
//判断失败,如果失败返回空
if (pf == NULL)
{
perror("fopen");
return 1;
}
//2.读文件,输入操作,从文件里面读取数据
int ch = 0;
while ((ch = fgetc(pf)) != EOF) //当fgetc不等于EOF时,可以正常运行
{
printf("%c ", ch);
}
//3.关闭文件
fclose(pf);
pf = NULL;
return 0;
}
也可以从键盘中读取
![](https://i-blog.csdnimg.cn/blog_migrate/ee26fe29d1b3bc0956b3fc799ec9d5ba.png)
可以打印到屏幕上
![](https://i-blog.csdnimg.cn/blog_migrate/f3a5bc7d5c2d94cf3ecb1f726c026469.png)
fputs 文本行输出函数
输入一行
int main()
{
//1.打开文件
FILE* pf = fopen("test.txt", "w");
//判断失败,如果失败返回空
if (pf == NULL)
{
perror("fopen");
return 1;
}
//2.写文件,写一行
fputs("qwertyuuio\n", pf);
fputs("**********\n", pf);
//3.关闭文件
fclose(pf);
pf = NULL;
return 0;
}
这里面只有这两个,“w”会把之前创建的销毁。
fgets文本输入函数
输出行
int main()
{
char arr[256] = { 0 };//fgets特性先创建个数组
//1.打开文件
FILE* pf = fopen("test.txt", "r");
//判断失败,如果失败返回空
if (pf == NULL)
{
perror("fopen");
return 1;
}
//2.读文件
//fgets(arr, 256, pf);
读一行,最大容量是255个字符,因为有个\0,放到arr里面
//printf("%s", arr);
//fgets(arr, 256, pf);
打印两次就可以都打印出来
//当不知道里面有几行的时候
while (fgets(arr, 256, pf) != NULL)
{
printf("%s", arr);
}
//3.关闭文件
fclose(pf);
pf = NULL;
return 0;
}
fprintf 格式化输出函数
可以把结构体存到文件
struct S
{
char name[20];
int age;
double d;
};
int main()
{
struct S s = { "张三",20,97.5 };
//1.打开文件
FILE*pf=fopen("test1.txt","w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//2.写文件
fprintf(pf, "%s, %d, %lf", s.name, s.age, s.d);
//3.退出文件
fclose(pf);
pf = NULL;
return 0;
}
fscanf 格式化输入函数
struct S
{
char name[20];
int age;
double d;
};
int main()
{
struct S s = {0};
//1.打开文件
FILE* pf = fopen("test1.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//2.读文件
fscanf(pf, "%s %d %lf", s.name, &(s.age), &(s.d));
printf("%s %d %lf", s.name, s.age, s.d);
//3.退出文件
fclose(pf);
pf = NULL;
return 0;
}
fwrite 二进制输出 文件
struct S
{
char name[20];
int age;
double d;
};
int main()
{
struct S s = { "张三",20,99.44 };
FILE* pf=fopen("test3.txt","wb"); //wb写入一个二进制
if (pf == NULL)
{
perror(fopen);
return 1;
}
fwrite(&s,sizeof(struct S),1,pf);
fclose(pf);
pf = NULL;
return 0;
}
fread 二进制输入 文件
struct S
{
char name[20];
int age;
double d;
};
int main()
{
struct S s = { 0};
//读文件
FILE* pf = fopen("test3.txt", "rb"); //rb读二进制
if (pf == NULL)
{
perror(fopen);
return 1;
}
fread(&s, sizeof(struct S), 1, pf);
printf("%s %d %lf", s.name, s.age, s.d);
fclose(pf);
pf = NULL;
return 0;
}
4.文件的随机读写
fseek 根据文件指针的位置和偏移量来定位文件指针
int main()
{
FILE* pf = fopen("test2.txt", "r");//只读
//abcdef
if (pf == NULL)
{
perror("fopen");
return 1;
}
int ch = fgetc(pf); // a
printf("%c ",ch);
ch = fgetc(pf); //b
printf("%c ", ch);
fseek(pf,2,SEEK_CUR);
//从当前位置偏移2个位置,c+2到e
ch = fgetc(pf); //e
printf("%c ", ch);
fclose(pf);
pf = NULL;
return 0;
}