1.复习
1.文件指针
a) 文件指针不能直接操作,必须通过文件操作库函数使用
FILE *fp = NULL
栈解旋 <= 高大上,其实只是离开栈区,变量自动释放
2 作业
sprintf:
sscanf
3 fgets读取内容
4 文件版四则运算
#include <stdio.h>
#include <string.h>
void write_file()
{
// 1 打开文件
FILE *fp = fopen("./1.txt", "w");
// 2 写文件
fputs("10+10=\n", fp);
fputs("10-10=\n", fp);
fputs("10*10=\n", fp);
fputs("10+5=\n", fp);
fputs("10-5=\n", fp);
fputs("10*5=\n", fp);
fputs("10/5=\n", fp);
fputs("10/2=", fp);
// 3 读文件
fclose(fp);
}
int calc(int a, int b, char ch)
{
switch (ch)
{
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
return 0;
}
return 0;
}
void read_file()
{
//1、打开文件
FILE *fp = fopen("1.txt", "r");
//2、读文件
char buf[1024];
char tmp[1024 * 4] = {0};
while (1)
{
memset(buf, 0, sizeof(buf));
// 遇到\n 文件结束符 出错 结束本次读取
fgets(buf, sizeof(buf), fp);
if (strlen(buf) > 0)
{
// printf("buf= %s\n", buf);
int a, b;
char ch;
sscanf(buf, "%d%c%d=\n", &a, &ch, &b);
// printf("%d%c%d=%d\n", a, ch, b, calc(a, b, ch));
sprintf(buf, "%d%c%d=%d\n", a, ch, b, calc(a, b, ch));
strcat(tmp, buf);
}
// 如果文件结束,跳出循环
if (feof(fp))
{
break;
}
}
// printf("%s", tmp);
// 3、关闭文件
fclose(fp);
// 关闭文件后,重新以w方式打开文件,目的清空文件,重新写内容
fp = fopen("1.txt", "w");
fputs(tmp,fp);
}
int main(int argc, char const *argv[])
{
write_file();
read_file();
return 0;
}
5 文件版排序
6 文件版排版补充
7 fprintf的使用
带s就是把屏幕/键盘 换成文件
8 fprintf的使用补充
9 fscanf使用
注意:fscanf个fgets是有区别的,需要对比一下
区别在于fgets读到最后的光标位置会再多读一次,读到EOF然后结束
而fscanf按固定格式读取,如果没有最后就不读取了
10 文件版排序2
11 上午知识点回顾
sprintf
12 fwrite的使用
上面的操作文本文件比较合适
下面的即可以读取文本文件,还可以读取二进制文件(按块大小,不是只针对字符串
返回值是往文件里写入的块数
13 fread的使用
14 fread返回值说明
1. 如果文件内容大小 > 用户指定的读取大小,返回值为用户指定的块数目2.
// 文件的大小为: 数目*块的大小
// int ret = fread(&s[0],sizeof(Student),2,fp);
2. 如果文件内容大小 < 用户指定的读取大小,返回值为实际读取的块数目
// 实际读取的块数目 < 用户指定的读取大小,也有可能为0
// int ret = fread(&s[0],sizeof(s),10,fp);
// 用户指定要10 * sizeof(s) 的大小, 文件只有0.4个sizeof(s) 返回值为0
怎么解决这个问题呢:
//骚操作
int ret = fread(&s[0],1,sizeof(s)*10,fp)
//如果把块大小指定为1,返回值就是读取文件的总大小
15 fread的使用2
16 拷贝命令的实现
再手写一遍:
if(argc != 3)
{
printf(“err: ./a.out src dst\n”);
return 0;
}
// 1、打开源文件 argcv[1] r
FILE *rFp = fopen(argv[1],”r”)
// 2、打开目的文件 argv[2] w
FILE *wFp = fopen(argv[2],”w”)
// 循环操作
// 从源文件读取内容,再把内容写入到目的文件,读多少写多少
char buf[4*1024]
int len
while(1)
{
len = fread(buf,1,sizeof(buf),rfp);
printf(“len = %d\n”,len);
if(len == 0)
{
break;
}
fwrite(buf,1,len,wFp);
}
// 关闭文件
fclose(rFp)
fclose(wFp)
18 windows和linux文本文件区别
windows平台的文本换行符”\r\n”
linux平台的文本换行符”\n”
导致这种情况
(在linux下的写的,放到windows的记事本里打开:)
注意:
(用C语言操作的话,如果你这么写代码的话兼容性会不好
解决方法:
!用rb wb来打开:
19 随机位置读写
(建议读, 不要写,因为自己操作写很容易乱
fseek:
ftell:
(相当于回到开头文件位置)
(没用)
(相当于移动到最后)
开头不能往左移,末尾可以往后移
20 文件的删除和重命名
获取文件状态:
类似于windows右键属性
需要定义结构体使用:
然后会把结构体改了,里面就有这些内容了:
删除文件和文件重命名:
就算我不会这两个,我也可以通过调用system:
system(“mv a.txt b.txt”)
21 缓冲区结束
(系统调用不采用,只有标准C才采用
(即使缓冲区没有满,也要往文件里写,不需要缓冲区满了再写