当前位置: 首页 > news >正文

嵌入式学习——Shell()——day21

(1)标准IO——有缓存

            1.打开文件    fopen
            2.读写文件
                        fgetc/fputc
                        fgets/fputs 
                        fprintf/fscanf 
            3.关闭文件    fclose

1. 缓存(标准IO有缓存,文件IO没有缓存)——从流中读写数据时标准IO没有缓存

1.1 全缓存        4096字节(4k)

        刷新条件:
            1.缓存区满刷新
            2.fflush刷新
            3.fclose刷新

1.2 行缓存        1024字节(1k)stdin、stdout

        刷新条件:
            1.缓存区满刷新
            2.fflush刷新
            3.fclose刷新
            4.遇到\n刷新

1.3 不缓存        0k        stderr

        立即刷新不缓存    

(2)  二进制文件读写

            fwrite/fread

(3) 流的定位函数接口

1. fseek

1.1 定义

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

1.2 功能

        定位流的偏移量

1.3 参数

        stream:文件流指针
        offset:偏移量
            > 0 向后偏移
            < 0 向前偏移 
        whence: 偏移的基准   
            SEEK_SET        文件开头
            SEEK_CUR    文件当前位置
            SEEK_END    文件末尾

1.4   返回值

        成功返回0 
        失败返回-1 

1.5  示例代码

#include <stdio.h>int main(void)
{char buf[512]={0};FILE* fp = fopen("1.c", "r");if(NULL == fp){printf("fopen error!\n");return -1;}fseek(fp, 9, SEEK_SET);fgets(buf, sizeof(buf), fp);printf("%s", buf);fclose(fp);return 0;
}

2. rewind

2.1 定义

       void rewind(FILE *stream); 

2.2 功能

        将文件流指针偏移量定义为开头——等价于 fseek(stream, 0, SEEK_SET);

2.3 参数

        stream:文件流指针

2.4  示例代码

#include <stdio.h>int main(void)
{char buf[512]={0};FILE* fp = fopen("1.c", "r");if(NULL == fp){printf("fopen error!\n");return -1;}fseek(fp, 9, SEEK_SET);rewind(fp);fclose(fp);return 0;
}

3. ftell

3.1 定义

       long ftell(FILE *stream); 

3.2 功能

        获得流的偏移量

3.3 参数

        stream:文件流指针

3.4  示例代码

#include <stdio.h>int main(void)
{char buf[512]={0};long num = 0;FILE* fp = fopen("1.c", "r");if(NULL == fp){printf("fopen error!\n");return -1;}fseek(fp, 0, SEEK_END);num = ftell(fp);rewind(fp);printf("num = %ld\n", num);fclose(fp);return 0;
}

(4) 文件IO步骤

        1. open/close

        2. read/write

        3. lseek

(5)文件IO函数接口

1 open

        1. 定义

            int open(const char *pathname, int flags);
            int open(const char *pathname, int flags, mode_t mode);   

        2. 功能

                打开文件并获得操作文件的文件描述符

        3. 参数

                pathname:要打开的文件路径对应字符串的首地址

                flags:
                    O_RDONLY        只读
                    O_WRONLY        只写
                    O_RDWR            读写
            
                    O_CREAT            文件不存在创建(需要open传入第三个参数)
                    O_TRUNC            文件存在截断成0(清0)
                    O_APPEND          追加打开
                    O_ASYNC             异步IO
                    O_NONBLOCK     非阻塞IO
                    O_EXCL                检测文件是否存在 

        4. 返回值

                成功返回新文件描述符
                失败返回-1 

        5. 示例程序

        注意使用open时要加头文件

        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(void)
{int fd = 0;fd = open("1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);if (-1 == fd){printf("open failed!\n");return -1;}return 0;
}

2 close

        1. 定义

                int close(int fd); 

        2. 功能

                关闭文件描述符

        3. 参数

                fd  文件描述符

        4. 返回值

                成功返回0 
                失败返回-1 

        5. 示例程序

        注意使用close时要加头文件

        #include <unistd.h>

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(void)
{int fd = 0;fd = open("1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);if (-1 == fd){printf("open failed!\n");return -1;}close(fd);return 0;
}

3 write

        1. 定义

                ssize_t write(int fd, const void *buf, size_t count); 

        2. 功能

                向文件描述符对应文件中写入buf开始的count个字节数据

        3. 参数

                fd:文件描述符
                buf:存放数据空间的首地址
                count:写入字节的个数

        4. 返回值

                成功返回实际写入的字节数
                失败返回-1  

        5. 示例程序

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main(void)
{int fd = 0;ssize_t size = 0;char buf[32] = "supercarrydoinb";fd = open("2.c", O_WRONLY | O_CREAT | O_TRUNC, 0666);if (-1 == fd){printf("open error!\n");return -1;}size = write(fd, buf, strlen(buf));printf("size = %ld\n", size);close(fd);return 0;
}

4 read

        1. 定义

                ssize_t read(int fd, void *buf, size_t count); 

        2. 功能

                从文件描述符中读取count个字节,放入buf指向的空间中

        3. 参数

                fd:文件描述符 
                buf:存放数据空间首地址 
                count:最多读取数据字节数

        4. 返回值

                成功返回实际读到字节数
                失败返回-1 
                读到文件末尾返回0 

        5. 示例程序

                1.简单程序 

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> int main(void)
{int fd = 0;ssize_t num = 0;char buf[1024] = {0};fd = open("2.c", O_RDONLY);if (-1 == fd){printf("open error!\n");return -1;}num = read(fd, buf, sizeof(buf));printf("buf = %s\n", buf);printf("num = %ld\n", num);close(fd);return 0;
}

                2. 使用write和read完成图片的复制

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(void)
{int src = 0;int dst = 0;src = open("1.png", O_RDONLY);dst = open("3.png", O_WRONLY | O_CREAT | O_TRUNC, 0666);if (-1 == src || -1 == dst){printf("open error!\n");return -1;}while (1){char buf[1024] = {0};ssize_t size = 0;size = read(src, buf, sizeof(buf));if (0 == size){break;}write(dst, buf, sizeof(buf));}close(src);close(dst);return 0;
}

(6) 文件IO偏移量定位函数接口

        lseek

        1. 定义

                off_t lseek(int fd, off_t offset, int whence);

        2. 功能

                重定位文件描述符的偏移量

        3. 参数

            fd:文件描述符
            offset:偏移量
                >0 向后偏移
                <0 向前偏移
            whence:
                SEEK_SET    文件开头
                SEEK_CUR    文件当前位置
                SEEK_END    文件末尾

        4. 返回值

            成功返回偏移量
            失败返回-1 

        5. 示例程序

                

              

http://www.lryc.cn/news/350419.html

相关文章:

  • STM32学习计划
  • 小米15曝光?可能会要稍微涨价
  • 深度优先搜索汇总
  • 【虚拟仿真】Unity3D中实现对大疆无人机遥控器手柄按键响应
  • Python学习之路 | Python基础语法(一)
  • 【已解决】AttributeError: module ‘clip‘ has no attribute ‘load‘
  • 安卓实现连接wesokcet
  • Xinstall助力App下载量精准统计,洞悉推广效果
  • CSS字体修饰
  • 高并发缓存服务的构建要点与陷阱
  • Electron学习笔记(五)
  • 【jest 调试 - vscode debug】
  • 华为OD机试【分奖金】(java)(100分)
  • 27- ESP32-S3 USB虚拟串口(USB-OTG 外设介绍)
  • PostgreSQL查看sql的执行计划
  • macOS Ventura 13如何设置定时重启(命令行)
  • 【sass简介以及如何安装使用】
  • Git版本控制工具的原理及应用详解(四)
  • AI图书推荐:ChatGPT全面指南—用AI帮你更健康、更富有、更智慧
  • C++ | Leetcode C++题解之第92题反转链表II
  • 【管理咨询宝藏99】离散制造智能工厂战略规划方案
  • java8 Stream使用中的一些实践
  • 入门篇:Kafka基础知识·
  • SWAT模型高阶应用暨SWAT模型无资料地区建模、不确定分析及气候、土地利用变化对水资源与面源污染影响分析
  • 每日一题——力扣206. 反转链表(举一反三、思想解读)
  • 【qt】纯代码界面设计
  • 【深度学习】SDXL中的Offset Noise,Diffusion with Offset Noise,带偏移噪声的扩散
  • 开发属于自己的Spring Boot Starter-18
  • C中Mysql的基本api接口
  • grafana10.x报错 Failed to upgrade legacy queries Datasource x was not found