第十一天 文件操作下


printf --- sprintf --- fprintf: 

    变参函数:参数形参中 有“...”, 最后一个固参通常是格式描述串(包含格式匹配符), 函数的参数个数、类型、顺序由这个固参决定。

    printf("hello");
        
    printf("%s", "hello");

    printf("ret = %d+%d\n", 10, 5);

    printf("%d = %d%c%d\n", 10+5, 10, '+', 5);            --> 屏幕


    char buf[1024];   //缓冲区  

    sprintf(buf, "%d = %d%c%d\n", 10+5, 10, '+', 5);        --> buf 中

    FILE * fp = fopen();

    fprintf(fp, "%d = %d%c%d\n", 10+5, 10, '+', 5);            --> fp 对应的文件中

scanf --- sscanf --- fscanf

    scanf("%d", &m);        键盘 --> m


    char str[] = "98";

    sscanf(str, "%d", &m);        str --> m


    FILE * fp = fopen("r");

    fscanf(fp, "%d", &m);        fp指向的文件中 --> m


fprintf()函数:

    写

    int fprintf(FILE * stream, const char * format, ...);

fscanf()函数:

    读

    int fscanf(FILE * stream, const char * format, ...);

        成功:正确匹配的个数。

        失败: -1

    1) 边界溢出。 存储读取的数据空间。在使用之前清空。

    2)fscanf函数,每次在调用时都会判断下一次调用是否匹配参数2, 如果不匹配提前结束读文件。(feof(fp) 为真)。


练习:文件版排序

    生成随机数,写入文件。将文件内乱序随机数读出,排好序再写回文件。


fgetc --- fputc

fgets --- fputs

fprintf -- fscanf        默认处理文本文件。


fwrite()函数:            既可处理以文本文件。也处理二进制文件。

    写出数据到文件中。

    stu_t stu[4] = { ...... };

    size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

        参1:待写出的数据的地址

        参2:待写出数据的大小

        参3:写出的个数                -- 参2 x 参3 = 写出数据的总大小。

        参4:文件

        返回值: 成功:永远是 参3 的值。 --- 通常将参2 传 1. 将参3传实际写出字节数。

             失败:0 

fread()函数:

    从文件fp中读出数据。

    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

        参1:读取到的数据存储的位置

        参2:一次读取的字节数

        参3:读取的次数                -- 参2 x 参3 = 读出数据的总大小

        参4:文件

        返回值: 成功:参数3.    --- 通常将参2 传 1. 将参3传欲读出的字节数。                

             0:读失败 -- 到达文件结尾 -- feof(fp)为真。 

练习:大文件拷贝

    已知一个任意类型的文件,对该文件复制,产生一个相同的新文件。

    1. 打开两个文件, 一个“r”, 另一“w”

    2. 从r中 fread , fwrite到 w 文件中。

    3. 判断到达文件结尾 终止。  

    4. 关闭。

    注意: 在windows下,打开二进制文件(mp3、mp4、avi、jpg...)时需要使用“b”。如:“rb”、“wb”
    

随机位置 读:

    文件读写指针。在一个文件内只有一个。

    fseek():

        int fseek(FILE *stream, long offset, int whence);

            参1:文件

            参2:偏移量(矢量: + 向后, - 向前)

            参3:    SEEK_SET:文件开头位置

                SEEK_CUR:当前位置

                SEEK_END:文件结尾位置

        返回值: 成功:0, 失败: -1

    ftell():

        获取文件读写指针位置。

        long ftell(FILE *stream);

        返回:从文件当前读写位置到起始位置的偏移量。

        
        借助 ftell(fp) + fseek(fp, 0, SEEK_END); 来获取文件大小。

    rewind():

        回卷文件读写指针。 将读写指针移动到起始位置。

        void rewind(FILE *stream);


Linux和windows文件区别:

    1)对于二进制文件操作, Windows 使用“b”, Linux下二进制和文本没区别。

    2)windows下,回车 \r, 换行 \n。 \r\n  , Linux下 回车换行\n

    3) 对文件指针,先写后读。windows和Linux效果一致。

               先读后写。Linux无需修改。windows下需要在写操作之前添加 fseek(fp, 0, SEEK_CUR); 来获取文件读写指针,使之生效。

获取文件状态:

    打开文件,对于系统而言,系统资源消耗较大。

头文件:

#include <sys/types.h>

#include <sys/stat.h>

    int stat(const char *path, struct stat *buf);

        参1: 访问文件的路径

        参2: 文件属性结构体

        返回值: 成功: 0, 失败: -1;


删除、重命名文件:

    int remove(const char *pathname); 删除文件。

    int rename(const char *oldpath, const char *newpath);  重名文件

缓冲区刷新:

    标准输出-- stdout -- 标准输出缓冲区。   写给屏幕的数据,都是先存缓冲区中,由缓冲区一次性刷新到物理设备(屏幕)

    标准输入 -- stdin -- 标准输入缓冲区。    从键盘读取的数据,直接读到 缓冲区中, 由缓冲区给程序提供数据。

    预读入、缓输出。

    行缓冲:printf(); 遇到\n就会将缓冲区中的数据刷新到物理设备上。

    全缓冲:文件。 缓冲区存满, 数据刷新到物理设备上。

    无缓冲:perror。 缓冲区中只要有数据,就立即刷新到物理设备。

    

    文件关闭时, 缓冲区会被自动刷新。  隐式回收:关闭文件、刷新缓冲区、释放malloc

    手动刷新缓冲区: 实时刷新。

        int fflush(FILE *stream);

            成功:0

            失败:-1

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值