0
点赞
收藏
分享

微信扫一扫

C语言基础 (13) 文件的读写操作 FILE

1.复习

 

1.文件指针

a)       文件指针不能直接操作,必须通过文件操作库函数使用

FILE *fp = NULL

C语言基础 (13) 文件的读写操作 FILE_文本文件

 

栈解旋 <= 高大上,其实只是离开栈区,变量自动释放

C语言基础 (13) 文件的读写操作 FILE_linux_02

C语言基础 (13) 文件的读写操作 FILE_文本文件_03

2 作业

 

sprintf:

C语言基础 (13) 文件的读写操作 FILE_linux_04

 

 

sscanf

C语言基础 (13) 文件的读写操作 FILE_linux_05

 

 

3 fgets读取内容

C语言基础 (13) 文件的读写操作 FILE_linux_06

 

4 文件版四则运算

C语言基础 (13) 文件的读写操作 FILE_C++_07

#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的使用

 C语言基础 (13) 文件的读写操作 FILE_linux_08

带s就是把屏幕/键盘 换成文件

 

C语言基础 (13) 文件的读写操作 FILE_linux_09

8 fprintf的使用补充

 

9 fscanf使用

C语言基础 (13) 文件的读写操作 FILE_linux_10

注意:fscanf个fgets是有区别的,需要对比一下

 区别在于fgets读到最后的光标位置会再多读一次,读到EOF然后结束

 而fscanf按固定格式读取,如果没有最后就不读取了

 

10 文件版排序2

 

11 上午知识点回顾

C语言基础 (13) 文件的读写操作 FILE_文本文件_11

 

C语言基础 (13) 文件的读写操作 FILE_打开文件_12

 

 sprintf

C语言基础 (13) 文件的读写操作 FILE_文本文件_13

 

12 fwrite的使用

 

C语言基础 (13) 文件的读写操作 FILE_打开文件_14

上面的操作文本文件比较合适

下面的即可以读取文本文件,还可以读取二进制文件(按块大小,不是只针对字符串

C语言基础 (13) 文件的读写操作 FILE_打开文件_15

返回值是往文件里写入的块数

C语言基础 (13) 文件的读写操作 FILE_文本文件_16

 

13 fread的使用

C语言基础 (13) 文件的读写操作 FILE_linux_17

 

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,返回值就是读取文件的总大小

 C语言基础 (13) 文件的读写操作 FILE_linux_18

15 fread的使用2

C语言基础 (13) 文件的读写操作 FILE_linux_19

 

 

16 拷贝命令的实现

C语言基础 (13) 文件的读写操作 FILE_C++_20

C语言基础 (13) 文件的读写操作 FILE_C++_21

 

C语言基础 (13) 文件的读写操作 FILE_打开文件_22

 

 

 

再手写一遍:

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文本文件区别

C语言基础 (13) 文件的读写操作 FILE_linux_23

C语言基础 (13) 文件的读写操作 FILE_linux_24

 

windows平台的文本换行符”\r\n”

linux平台的文本换行符”\n”

 

导致这种情况

C语言基础 (13) 文件的读写操作 FILE_linux_25

 

 

(在linux下的写的,放到windows的记事本里打开:)

 

注意:

C语言基础 (13) 文件的读写操作 FILE_打开文件_26

(用C语言操作的话,如果你这么写代码的话兼容性会不好

 

解决方法:

C语言基础 (13) 文件的读写操作 FILE_打开文件_27

 

 

!用rb wb来打开:

 

19 随机位置读写

(建议读, 不要写,因为自己操作写很容易乱

 

fseek:

C语言基础 (13) 文件的读写操作 FILE_文本文件_28

 

ftell:

C语言基础 (13) 文件的读写操作 FILE_打开文件_29

 

C语言基础 (13) 文件的读写操作 FILE_C++_30

(相当于回到开头文件位置)

 

C语言基础 (13) 文件的读写操作 FILE_C++_31

 

C语言基础 (13) 文件的读写操作 FILE_linux_32

(没用)

 

C语言基础 (13) 文件的读写操作 FILE_打开文件_33

 

C语言基础 (13) 文件的读写操作 FILE_打开文件_34

 

(相当于移动到最后)

 

开头不能往左移,末尾可以往后移

 

C语言基础 (13) 文件的读写操作 FILE_linux_35

 

 

20 文件的删除和重命名

 

获取文件状态:

C语言基础 (13) 文件的读写操作 FILE_文本文件_36

 

类似于windows右键属性

 

 C语言基础 (13) 文件的读写操作 FILE_C++_37

 

需要定义结构体使用:

 

C语言基础 (13) 文件的读写操作 FILE_linux_38

 

 

然后会把结构体改了,里面就有这些内容了:

C语言基础 (13) 文件的读写操作 FILE_打开文件_39

 

删除文件和文件重命名:

C语言基础 (13) 文件的读写操作 FILE_linux_40

 

就算我不会这两个,我也可以通过调用system:

 

system(“mv a.txt b.txt”)

 

21 缓冲区结束

 C语言基础 (13) 文件的读写操作 FILE_C++_41

C语言基础 (13) 文件的读写操作 FILE_linux_42

(系统调用不采用,只有标准C才采用

 

C语言基础 (13) 文件的读写操作 FILE_C++_43

(即使缓冲区没有满,也要往文件里写,不需要缓冲区满了再写

 C语言基础 (13) 文件的读写操作 FILE_C++_44

 



举报

相关推荐

0 条评论