文章目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8655abcb780af8010a8397f80c1db6bc.png)
文件打开和关闭
int main()
{
//打开文件
//FILE* pf = fopen("G:\\class_test\\文件与预处理\\test1.txt", "a+");//绝对路径
FILE* pf = fopen("test1.txt", "a+");//相对路径
if (pf == NULL)
{
perror("fopen");
return 1;
}
//操作文件
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
文件顺序读写
fgetc 和 fputc
int main()
{
//打开文件
FILE* pf = fopen("test2.txt", "a+");
if (pf == NULL)
{
perror("fopen");
return 1;
}
写文件
int ch;
//for (ch = 33; ch <= 100; ch++)
//{
// fputc(ch, pf);
//}
//读文件
while ((ch = fgetc(pf)) != EOF)
{
printf("%c ", ch);
}
//
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
int main()
{
//读键盘
//标准输入流 从键盘读
int ch = fgetc(stdin);
//printf("%c", ch);
fputc(ch, stdout);//输出流,输入到屏幕
return 0;
}
fgets 和 fputs
写文件
int main()
{
//打开文件
FILE* pf = fopen("test3.txt", "a");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fputs("555555\n", pf);
fputs("sfsvdc\n", pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
读文件
int main()
{
char arr[256] = { 0 };
//打开文件
FILE* pf = fopen("test3.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件 //读一行
//fgets(arr, 256, pf);//最多读(256-1)个字符
//printf("%s\n", arr);
while (fgets(arr,256,pf)!= NULL)//当遇到错误或结束,fgets函数返回NULL
{
printf("%s", arr);
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
fprintf 和 fscanf
写
struct S
{
char name[20];
int age;
double d;
};
int main()
{
struct S s = { "zhangsan",20,95.3 };
//打开文件
FILE* pf = fopen("test_t.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fprintf(pf, "%s %d %lf", s.name, s.age, s.d);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
读
struct S
{
char name[20];
int age;
double d;
};
int main()
{
struct S s = { 0 };
//打开文件
FILE* pf = fopen("test_t.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
fscanf(pf, "%s %d %lf", s.name, &(s.age), &(s.d));
//printf("%s %d %lf", s.name, s.age, s.d);
fprintf(stdout,"%s %d %lf", s.name, s.age, s.d);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
可以分别与scanf 和 printf 对比学习
sprintf
struct S
{
char name[20];
int age;
double d;
};
int main()
{
char buf[256] = { 0 };
struct S s = { "张三",20,95.3 };
sprintf(buf, "%s %d %lf", s.name, s.age, s.d);
printf("%s", buf);
return 0;
}
struct S
{
char name[20];
int age;
double d;
};
int main()
{
char buf[256] = { 0 };
struct S s = { "张三",20,95.3 };
struct S tmp = { 0 };
sprintf(buf, "%s %d %lf", s.name, s.age, s.d);
printf("%s", buf);//字符串形式
//从buf里面提取结构体数据
sscanf(buf, "%s %d %lf", tmp.name, &(tmp.age), &(tmp.d));
printf("%s %d %lf", tmp.name, tmp.age, tmp.d);//格式化形式
return 0;
}
fread 和 fwrite
struct S
{
char name[20];
int age;
double d;
};
int main()
{
struct S s = { "张san",20,95.3 };
FILE* pf = fopen("test_er.txt", "wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件 二进制方式
fwrite(&s, sizeof(struct S), 1, pf);
fclose(pf);
pf = NULL;
return 0;
}
fwrite(&s, sizeof(struct S), 1, pf);
将地址s里面的内容写进pf里面,写一次,大小为结构体struct S
所占字节
int main()
{
struct S s = { 0 };
FILE* pf = fopen("test_er.txt", "rb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件 二进制方式
fread(&s, sizeof(struct S), 2, pf);
printf("%s %d %lf", s.name, s.age, s.d);
fclose(pf);
pf = NULL;
return 0;
}
fread(&s, sizeof(struct S), 2, pf);
将地址pf里面的内容读到结构体变量s里面,最多读2次,大小为结构体struct S
所占字节,
文件随机读写
fseek
读文件
int main()
{
FILE* pf = fopen("a.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
char ch = '0';
printf("%c\n", ch);//0
ch = fgetc(pf);
printf("%c\n", ch);//a
fseek(pf, 0, SEEK_END);
ch = fgetc(pf);
printf("%c\n", ch);//e
fseek(pf, 2, SEEK_SET);//c
ch = fgetc(pf);
printf("%c\n", ch);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
只能改写,不能插入
ftell
执行该操作后,文件指针就会返回到开始位置
例:
#include <stdio.h>
int main ()
{
FILE *fp;
int len;
fp = fopen("file.txt", "r");
if( fp == NULL )
{
perror ("打开文件错误");
return(-1);
}
fseek(fp, 0, SEEK_END);
len = ftell(fp);
fclose(fp);
printf("file.txt 的总大小 = %d 字节\n", len);
return(0);
}
假设我们有一个文本文件 file.txt,它的内容如下:
This is runoob.com
运行结果:
file.txt 的总大小 = 19 字节
rewind
让文件指针的位置回到文件的起始位置
//10000
int main()
{
int a = 10000;
FILE* pf = fopen("10000.txt", "wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//xie文件
fwrite(&a, 4, 1, pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
文件结束判定
1.被错误使用的feof
牢记:
在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
文件缓冲区
fflush(stdout);
刷新缓冲区中的内容到stdout中