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

文件IO的学习

1.打开文件   open

2.读写文件   read\write

3.关闭文件   close

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

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

功能:打开文件并获取一个文件描述符

参数:

        pathname:要打开的文件的文件名

        flags:打开方式

        O_RDONLY; 只读

        O_WRONLY;只写

        O_RDWR;可读可写

        O_CREAT;创建文件

        O_TRUNC;清空文件

        O_APPEND;追加写

     标准io                   文件io

        “r”                    O_RDONLY;

       “r+”                   O_RDWR

        “w”                   O_WRONLY| O_CREAT|O_TRUNC;0664

        “w+”                 O_RDWR|O_CREAT|O_TRUNC; 0664

        “a”                    O_WRONLY|O_APPEND|O_CREAT

        "a+"                 O_RDWR|O_APPEND|O_CREAT

文件描述符:操作系统一打开文件的标识符

小的,非负的整形数据

范围:0-1023(共1024个)

分配原则:最小未被使用原则

标准IO:---》 FILE *---》FILE ---》int fd;

文件io:---》fd(文件描述符)

系统默认已将打开的三个文件占用了012这三个文件描述符:

标准io                                         文件io

FILE*                                           int

stdio--》标准输入设备                   0

stdout--》标准输出设备                 1

stderr--》标准出错设备                 2

int close(fd);

文件描述符泄漏:打开的文件使用完时没有关闭会导致泄漏。

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

功能:向文件中写入数据

参数:

        fd:文件描述符

        buf:要写入数据的首地址

        count:要写入的字节数

返回值:

        成功:实际写入的字节数

        失败:-1

以下代码是关于write函数的用法。

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
int main()
{int fb = open("./1.txt",O_WRONLY| O_CREAT|O_TRUNC,0664);if(-1 == fb){printf("error\n");return -1;}char *p = "hello world";char s[32] = {"hello world"};write(fb,"hello world",11);write(fb,p,strlen(p));write(fb,s,strlen(s));close(fb);return 0;
}

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

功能:从文件中读取

参数:

        fd:文件描述符

        buf:存储数据的空间首地址

        count:希望读取的字节

返回值:

        成功:实际读到的字节数

        失败:-1

        读到文件末尾:0

以下代码是read函数的使用

在使用文件io实现cat功能或者实现文件拷贝功能时,如果文件过大一次性读写不完,时需要进行循环。

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
int main()
{int fb1 = open("/home/linux/include/stdio.h",O_RDONLY);if(0 > fb1){printf("error\n");return -1;}char buff[1024] = {0};while(1){ssize_t ret = read(fb1,buff,sizeof(buff));if(0 == ret){break;}if(-1 == ret){break;}write(1,buff,ret);}close(fb1);return 0;
}

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
int main(int argc,const char *argv[])
{if(argc<3){printf("usage ./a.out <fb> <fb2>");return -1;}int fb1 = open(argv[1],O_RDONLY);int fb2 = open(argv[2],O_WRONLY| O_CREAT|O_TRUNC,0664);if(-1 == fb1 || -1 == fb2){printf("error\n");return -1;}char buff[1024] = {0};
while(1){ssize_t ret = read(fb1,buff,sizeof(buff));if(0 == ret){break;}else if(-1 == ret){break;}write(fb2,buff,ret);}close(fb1);close(fb2);return 0;
}

lseek:

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

功能:文件读写位置定位

参数:

        fd:文件描述符

        offset:偏移量(字节)

        whence(要偏移的相对位置)

                SEEK_SET:文件开头位置

                SEEK_CUR:文件当前读写位置

                SEEK_END:文件末尾

返回值:

        成功:返回当前读写位置到文件开头

         失败:-1

求文件大小:

off_t len = lseek(fd,0,SEEK_END);

lseek(fd,0,SEEK_SET);//文件读写位置复位。

标准io:

1.属于c库函数,移植行强

2.标准io是系统调用的一次封装,增加了缓冲区,目的是提高数据读写的效率。

3.主要用于在普通文件的操作上

文件io:

1.属于系统调用,只用于linux操作系统,移植性弱。

2.文件io无缓冲区

3.文件io主要应用在对硬件的操作上,也可以操作普通文件

缓冲区:

1.行缓存 1k(1024字节)---》人机交互界面,终端

        缓冲区被刷新的方法

                1.程序结束自动刷新缓冲区。

                 2.遇到\n刷新。

                3.fflush(强制刷新)

                4.缓冲区满了自动刷新

2.全缓冲 4k(4096字节)---》文件缓冲区

                1.程序结束自动刷新

                2.fflush(强制刷新)

                3.文件关闭刷新

                4.缓冲区满了会刷新

3.无缓冲 0k ---》出错信息对应的设备。

                stderr---》无缓冲

#include <stdio.h>
#include <time.h>int main(int argc, const char *argv[])
{FILE *fp = fopen("1.txt", "w");time_t sec;//time(&sec);sec = time(NULL);printf("sec = %ld\n", sec);char *ptm = ctime(&sec);printf("ptm = %s\n", ptm);struct tm *pt = localtime(&sec);printf("[%d-%d-%d %d:%d:%d]\n", pt->tm_year+1900, pt->tm_mon+1,pt->tm_mday,pt->tm_hour, pt->tm_min, pt->tm_sec);fprintf(fp, "[%d-%d-%d %d:%d:%d]\n", pt->tm_year+1900, pt->tm_mon+1,pt->tm_mday,pt->tm_hour, pt->tm_min, pt->tm_sec);fclose(fp);return 0;
}

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

相关文章:

  • 论文Review 激光动态物体剔除 Dynablox | RAL2023 ETH MIT出品!
  • web前端第二次作业
  • 5G专网项目外场常见业务测试指南(六)-PingInfoView
  • 衡石HENGSHI SENSE6.0亮点功能-应用创作
  • 衡量机器学习模型的指标
  • HDI 线路板,如何突破普通线路板局限?
  • 基恩士3D视觉用于ABB机器人的KeyenceRobotVisionSetup.sys系统模块程序解析(九、KeyAbsMove)
  • centos 7 如何安装 ZipArchive 扩展
  • 百胜软件×华为云联合赋能,“超级国民品牌”海澜之家新零售加速前行
  • C语言栈的实现
  • NY198NY203美光固态闪存NY215NY216
  • 计算机毕设不知道选什么题目?基于Spark的糖尿病数据分析系统【Hadoop+Spark+python】
  • 鲲鹏arm服务器安装neo4j社区版,实现图书库自然语言检索基础
  • 25C机场航班调度程序(JS 100)
  • Neo4j Cypher
  • RK3568 Linux驱动学习——Linux LED驱动开发
  • Linux NAPI 实现机制深度解析
  • 【Oracle APEX开发小技巧16】交互式网格操作内容根据是否启用进行隐藏/展示
  • 2025年渗透测试面试题总结-16(题目+回答)
  • 力扣(LeetCode) ——移除链表元素(C语言)
  • 飞算AI:企业智能化转型的新引擎
  • 【电子硬件】EMI中无源晶振的优势
  • SpringBoot项目部署
  • string 类运算符重载
  • Win10系统Ruby+Devkit3.4.5-1安装
  • qt界面优化--api绘图
  • SpringBoot项目限制带参数接口配置使用数量实现
  • php+apache+nginx 更换域名
  • 力扣.870优势洗牌解决方法: 下标排序​编辑力扣.942增减字符串匹配最长回文子序列牛客.背包问题(最大体积)力扣.45跳跃游戏II 另一种思考
  • 牛客疑难题(6)