文件IO函数

linux系统中文件IO常用的函数(总结) 文件IO实质上是系统的调用,对于文件IO来说,它是没有缓冲区的,效率较低,可移植性差。fd指的是文件描述符,文件描述符是整数值,从0开始,当使用read()函数进行打开一个文件的时候返回的就是一个文件描述符fd。这时fd就代表这个打开的文件,对文件的操作就可以通过这个fd完成。在一个程序中默认打开的文件个数是1024个,所以fd的范围是0~1023查看的命令是ulimit -a如果要修改程序中可以打开的默认文件个数这个限制的话可以通过命令进行修改。... 阅读详情

一、文件打开与关闭函数

(一)open函数

所需头文件:#include <sys/types.h>、#include <sys/stat.h>、#include <fcntl.h>

原型:int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
用文件IO的方式打开文件

参数:
pathname文件路径和名字不写路径默认打开当前路径下的文件;
flags打开文件的方式:

  • O_RDONLY:以只读方式打开文件,文件不存在则打开失败,将光标定位到开头
  • O_WRONLY:以只写方式打开文件,文件不存在则打开失败,将光标定位到开头
  • O_RDWR:以读写方式打开文件,文件不存在则打开失败
  • O_APPEND:以追加方式打开文件,文件不存在则打开失败
  • O_CREAT:文件不存在则创建文件;如果flags中填写了O_CREAT,就必须填写第三个参数,第三个参数代表创建文件的权限。
  • O_TRUNC如果文件存在就清空;
  • O_EXCL:结合O_CREAT使用,如果文件不存在会创建文件;如果文件存在会报错,错误码为EEXIST

mode创建文件的权限,一般用8进制表示;实际创建出来的文件权限 = (mode & ~umask)
umask:文件的掩码,通过umask命令可以查看掩码的默认值是0002

~umask:文件掩码的取反是在最大文件的权限的基础上进行取反,最大文件的权限是0666(文件没有执行权限,所以可读可写:4+2=6);实际创建出来的文件权限 = (0666 & ~(0002)) = (0666 & 0664) = 0664。目录的最大权限0777(有可执行权限6+1=7)。

返回值:成功则返回文件描述符;失败则返回-1,错误码errno会被正确设置。

(二)close函数

所需头文件:#include <unistd.h>

原型:int close(int fd);   用文件IO的方式关闭文件

参数:fd文件描述符

返回值:成功则返回0;失败则返回-1,错误码errno会被正确设置。

#include <stdio.h>
//open函数所需头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

//close所需头文件
#include <unistd.h>

//errno所需头文件
#include <errno.h>
int main(int argc,const char* argv[])
{
    //第一个参数(文件):如果不写路径默认当前路径下的文件
    //第二个参数(打开文件方式):只读(O_RDONLY),若不存在则创建(O_CREAT)新文件
    //一旦创建新文件,则需要使用第三个参数,默认权限0666
    //如果文件不存在则创建文件,如果文件存在则报错
    int fd=0;//文件描述符(从3开始)
    fd=open("test.c",O_RDONLY|O_CREAT|O_EXCL,0666);
    if(fd == -1){
        //如果文件打开失败(前面有参数O_EXCL:不存在则创建,存在则报错)则错误码errno会重新设置
        if(errno == EEXIST){
            printf("文件已存在\n");
        }
        perror("文件打开失败");
        return -1;
    }
    printf("文件打开成功\n");
    printf("文件描述符fd=%d\n",fd);
    //使用open函数时要关闭文件(关闭文件描述符)
    //如果关闭文件成功,返回值0;关闭失败,返回值1
    int ret=0;
    ret=close(fd);
    if(ret == -1){
        perror("关闭文件失败");
        return -1;
    }
    printf("关闭文件成功,ret=%d\n",ret);
    return 0;
}

二、文件读写函数

(一)read函数

所需头文件:#include <unistd.h>

原型:ssize_t read(int fd, void *buf, size_t count);  用文件IO的方式读取文件中的内容

参数:fd文件描述符;buf存储读取到的数据的首地址;count想要读取的字节的个数

返回值:成功则返回读取到的字节的个数;返回0表示读取到文件的结尾。失败则返回-1,错误码errno会被正确设置。

    //从文件中读取数据
    char buf[1024]={0};
    ssize_t ret_read=0;
    //成功则返回读取到的数据总个数
    //如果read返回0,则读取到了文件的末尾
    //如果想要读取字节数超过了实际文件数据字节数,则read返回实际读取到的字节数
    ret_read=read(fd,buf,sizeof(buf));
    if(ret_read==-1){
        perror("文件读取失败");
        return -1;
    }
    printf("文件读取成功,ret_read=%ld\n",ret_read);
    printf("读取到的数据是:%s\n",buf);

(二)write函数

所需头文件:#include <unistd.h>

原型:ssize_t write(int fd, const void *buf, size_t count);  用文件IO的方式往文件中写入内容

参数:fd文件描述符;buf想要写入数据的首地址;count想要写入的字节的个数

返回值:成功则返回写入的字节的个数,返回0表示不会写任何的数据;失败则返回-1,错误码errno会被正确设置。

    //向文件中写入数据
    //向文件中写入一个整数
    int value=100;
    ssize_t ret_write=0;
    ret_write=write(fd,&value,sizeof(value));
    if(ret_write==-1){
        perror("写入一个整数失败");
        return -1;
    }
    printf("写入一个整数成功,ret_write=%ld\n",ret_write);

    //写入字符串
    char *str="hello";
    ret_write=write(fd,str,strlen(str));
    if(ret_write==-1){
        perror("写入一个字符串失败");
        return -1;
    }
    printf("写入一个字符串成功,ret_write=%ld\n",ret_write);

    //写入一个结构体
    struct Student stu={"lisa"};
    ret_write=write(fd,&stu,sizeof(stu));
    if(ret_write==-1){
        perror("写入一个结构体失败");
        return -1;
    }
    printf("写入一个结构体成功,ret_write=%ld\n",ret_write);

(三)read和write练习

实现文件的拷贝 cp 命令的功能

实现思路:对输入参数的参数个数进行检查;以只读方式打开源文件,以只写方式打开目标文件,并且判断文件是否打开成功;循环进行读取和写入;
代码完成拷贝后,需手动用diff命令验证两个文件中的内容是否相同;

#include <stdio.h>
//open函数所需头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

//read,write,close所需头文件
#include <unistd.h>

int main(int argc,const char* argv[])
{
    //检查参数个数
    if(argc!=3){
        printf("参数输入错误\n");
        printf("Usage:./a.out src dst\n");
        return -1;
    }

    //打开文件
    int src_fd=0;//文件描述符(从3开始)
    //O_RDONLY如果源文件 不存在则报错
    if((src_fd=open(argv[1],O_RDONLY)) == -1){
        perror("源文件打开失败");
        return -1;
    }
    printf("源文件打开成功\n");
    printf("源文件描述符src_fd=%d\n",src_fd);

    int dst_fd=0;//文件描述符(从3开始)
    //O_WRONLY如果目标文件 不存在则报错
    //以只写的方式打开目标文件,如果文件不存在则创建(O_CREAT)文件,如果文件存在则清空(O_TRUNC)写入
    if((dst_fd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666)) == -1){
        perror("目标文件打开失败");
        return -1;
    }
    printf("目标文件打开成功\n");
    printf("目标文件描述符dst_fd=%d\n",dst_fd);

    //循环读取与写入
    char buf[1024]={0};
    ssize_t ret_read=0;//用于接收read返回值
    ssize_t ret_write=0;//用于接收write返回值
    while((ret_read=read(src_fd,buf,sizeof(buf)))>0){
        ret_write=write(dst_fd,buf,ret_read);
        if(ret_write==-1){
            perror("写入目标文件失败");
            return -1;
        }
        if(ret_read!=ret_write){
            printf("写入的字节数与读取的字节数不一致");
            return -1;
        }
    }

    //关闭文件
    close(src_fd);
    close(dst_fd);
    return 0;
}

三、文件定位与控制函数

(一)lseek函数

所需头文件:#include <sys/types.h>、#include <unistd.h>

原型:off_t lseek(int fd, off_t offset, int whence);  定位光标的位置(光标实际指文件偏移量)

参数:fd文件描述符;
offset偏移量:

  • >0向后偏移;
  • =0不偏移;
  • <0向前移动

whence从哪个位置开始偏移

  • SEEK_SET :从文件的开头
  • SEEK_CUR:从当前位置
  • SEEK_END:从文件的结尾

若文件以 O_APPEND 打开,write 会强制将偏移量置为文件末尾,lseek 调整的偏移量仅对 read 生效

返回值:成功则返回从文件开头计算出的结果偏移量(单位:字节);失败则返回-1,错误码errno会被正确设置。

    //以读写和追加的方式打开文件
    int fd=0;//文件描述符(从3开始)
    if((fd=open("test.txt",O_RDWR|O_APPEND|O_CREAT,0666)) == -1){
        perror("文件打开失败");
        return -1;
    }
    printf("文件打开成功,文件描述符fd=%d\n",fd);

    //从文件开头偏移2
    off_t offset=0;
    if(-1==(offset=lseek(fd,2,SEEK_SET))){
        perror("文件定位失败");
        return -1;
    }
    printf("文件定位成功,offset=%ld\n",offset);

    //设置光标位置,读取文件数据
    char buf[1024]={0};
    if(read(fd,buf,sizeof(buf)) == -1){
        perror("读取数据失败");
        return -1;
    }
    printf("读取数据成功,buf=%s\n",buf);

    //写入数据---会追加到文件的末尾
    //虽然重新定位了光标位置,但如果以追加的方式打开文件,则会从末尾写入
    char *p="HELLO WORLD";
    if(write(fd,p,strlen(p))==-1){
        perror("写入数据失败");
        return -1;
    }
    printf("写入数据成功\n");

    //关闭文件
    close(fd);

(二)fcntl函数

所需头文件:#include <unistd.h>、#include <fcntl.h>

原型:int fcntl(int fd, int cmd, ... /* arg */ );  对打开的文件描述符进行多种控制(如 复制文件描述符、设置和获取文件描述符标志、实现文件锁等等)

参数:fd文件描述符;
cmd指定要执行的控制操作命令:

  • - F_DUPFD:复制描述符
  • - F_GETFD:获取描述符标志
  • - F_SETFL:设置文件状态标志(arg 是整数,如 O_NONBLOCK)
  • - F_GETLK:获取锁信息(arg 是 struct flock *)
  • - F_SETLK:尝试加锁(非阻塞,arg 是 struct flock *)
  • - F_SETLKW:阻塞加锁(arg 是 struct flock *)

struct flock {
        short l_type;//锁类型:F_RDLCK(读锁)、F_WRLCK(写锁)、F_UNLCK(解锁)
        short l_whence;//锁的基准位置(同 lseek 的 whence:SEEK_SET/SEEK_CUR 等)
        __kernel_off_t l_start;//锁的起始偏移量
        __kernel_off_t l_len;//锁的长度(0 表示到文件末尾)
        __kernel_pid_t l_pid;//持有锁的进程 ID(仅 F_GETLK 有效)
};

...可选参数,是否必填由 cmd 决定

返回值:

  • - F_DUPFD:成功返回新描述符,失败返回 -1
  • - F_GETFD/F_GETFL/F_GETLK:成功返回对应值,失败返回 -1
  • - F_SETFD/F_SETFL/F_SETLK/F_SETLKW:成功返回 0,失败返回 -1

基于Qt的工业组态软件开发:图形绘制与TCP通讯实现 在数据接收时,通过 readyRead 信号触发解析函数,校验数据包完整性后提取有效数据,并更新对应图形元素的状态,例如根据温度值改变矩形的填充色,实现设备状态可视化。测试阶段,我们将软件部署到Windows工控机,连接PLC设备进行通讯测试,结果表明图形元素响应及时,TCP数据传输稳定,满足工业现场的基本需求。综上所述,基于Qt的组态软件开发,核心在于利用 QGraphicsView 框架实现图形元素的灵活绘制与管理,结合 QTcpSocket 完成工业数据的可靠交互。 阅读详情

相关推荐

Holtek BS45F3833芯片深度剖析:如何用高集成MCU重塑超声波雾化市场格局?

本文深度剖析Holtek BS45F3833芯片如何通过高集成MCU技术重塑超声波雾化市场。该芯片集成了PWM直驱、电容检水、触摸控制等核心功能,显著提升雾化精度和效率,同时降低BOM成本和开发难度。文章通过实测数据和实战案例,展示了其在香薰机、车载设备及工业加湿器等场景的创新应用,为开发者提供了一站式解决方案。

weixin_29192211的博客 402

文件操作:文件IO操作流程及各类函数应用+标准IO与文件IO区别

文件IO是Linux内核专门为应用层提供的文件操作方法。 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);功能:打开文件并获得一个文件描述符参数 遵循 Linux 文件权限规则(如 对应八进制 , 对应 ),用于创建新文件时设定初始权限 。 3.返回值 成功:返回文件描述

2402_85476687的博客 2027

(P2)PALM软件的基本使用流程

上一篇介绍了PALM在Ubuntu系统上的下载安装及安装后的目录文件结构,这一篇以自带的案例介绍软件的基本操作流程。(请转至example_cbl项目) 输入 声明:官网均有各个变量的说明,以下代码来自软件自带案例 palm的最小输入文件是p3d文件,以下是example_cbl_p3d的详细说明。(文件语言格式Fortran,请自行先学习下语言的基本语法。笔者也是新学者,有非常多的问题,很多参数也不能准确的说出是什么意思,还请不吝赐教,谢谢!!!) !几点说明 !1、该运行文件基本由三大块组成:1)in

ysqzhatian的博客 3254

文件IO及其函数

一、文件IO 文件IO的函数是由操作系统提供的,与操作系统绑定的,又称之为系统调用 文件IO是不带缓冲区的 文件IO是通过文件描述符来维护一个文件 1. 文件描述符 标准IO对文件的读写是通过流指针实现的。 文件IO对文件的读写是通过文件描述符实现的。 尝试打开一个文件的时候,系统会自动给这个文件分配一个编号(文件描述符),用这个编号来描述这个文件。 标准IO就是对文件IO的二次封装,在文件IO的基础上封装了一个缓冲区,同时会将文件描述符一起封装到FILE结构体中

鹰击长空KO的博客 2359

5分钟搞懂超分算法:从插值到深度学习的实战对比(附Python代码)

本文系统对比了从传统插值到深度学习的主流超分算法,包括最近邻、双线性、双三次插值,以及基于边缘、统计模型和SRCNN、ESPCN、SRGAN等深度学习模型。通过实战代码和决策框架,帮助开发者根据图像质量、速度、资源等需求,快速选择最合适的超分辨率算法,实现从低清到高清的有效转换。

pp12345的博客 424

制造业批次管理中双计量单位动态转换的实践指南

本文详细介绍了制造业批次管理中双计量单位动态转换的实践指南,特别是在SAP系统中的配置与操作步骤。通过实际案例展示了如何解决采购与生产部门计量单位不一致的问题,提升物料管理效率。重点讲解了批次特性配置、移动类型调整及常见问题排查方法,适用于金属加工、化工等多个行业。

weixin_29228203的博客 151

Linux学习---常用文件IO函数

文件 IO 函数分类。

2203_75769742的博客 949

DLPFC.h5ad格式数据简便获取方式+STAGATE论文复现问题

简便获取DLPFC.h5ad格式的数据方式

apple_74057836的博客 2247

文件IO 和 标准IO函数详解

IO相关函数详解

Qingyuanlong的博客 924

Kaggle | 总奖池超200万美金的数学竞赛AIMO2冠军方案

••••结论1:通过结合高质量大规模数据集、工具集成推理和生成式选择方法,可以构建在挑战性数学问题上达到最先进水平的语言模型。本文的方法在 AIMO-2 竞赛中的胜利以及在多个数学基准上的 SOTA 结果验证了这一策略的有效性。结论2:发布 OpenMathReasoning 数据集、OpenMath-Nemotron 模型和代码是社区的宝贵财富。

hxshine的博客 1192

基于PCA的故障诊断方法(matlab)

1. PCA原理分析 PCA的原理主要是将原始数据进行降维。其具体工作原理参照:CodingLabs - PCA的数学原理 2. 数据预处理 训练数据集(只有正样本)为维数据,即有n个采样值,每个采样值有m个特征。 2.1 数据归一化 将数据X针对每个特征归一化为均值为0,均方根为1的数据。 其中: 3. PCA降维 3.1 首先求取协方差矩阵 协方差矩阵的公式为: 计算出来的协方差矩阵为特征m*m维矩阵。 3.2 求取特征值和特征向量 求取协方差矩阵R的特征值.

tangxianyu的博客 1万+

Linux 软件编程:文件IO、目录IO、时间函数

打开目录文件 → 读取目录项 → 关闭目录文件。

m0_74317917的博客 646

Rockchip MPP解码H264实战:从文件到YUV的完整流程解析

本文详细解析了在Rockchip平台上使用MPP(Media Process Platform)硬件解码H264视频文件并输出YUV数据的完整流程。通过实战代码示例,深入讲解了MPP解码器的初始化、数据包投递、非阻塞模式下的双循环控制以及YUV帧的提取与保存等核心步骤,并提供了环境搭建、编译运行和常见问题排查指南,帮助开发者高效利用硬件加速进行视频处理。

life6的博客 473

文件IO(Linux文件IO,目录操作函数)

本文介绍Linux系统下自带的文件IO的函数、文件权限掩码(umask)、目录操作函数(stat函数获取文件属性,opendir函数打开目录,readdir函数读取目录,每次读取一个文件,closedir函数关闭文件目录)。

afdtsadfasudfasu的博客 445

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

io函数 day3 文件io与系统函数

【代码】io函数 day3 文件io与系统函数。

2302_76213070的博客 448

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

文件io(函数接口)

练习,向文件中第10个位置后面写一个字符,往后移动20个位置,往后移动20个位置处,写一行字符串hello进去,求此时文件的长度。思路,循环读,读到就累加行数,并且打印到终端,判断是否达到最后一行,达到就退出。例:head -3 test.c -> ./a.out -3 test.c。思考:文件io和标准io的打开方式的对应关系。练习:实现head-n文件名命令的功能。argv[1]+1: "3" 的首地址。argv[1]: "-3" 的首地址。read -> 0末尾 -1失败。标准io和文件io的总结。

weixin_64032452的博客 437

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Linux文件IO函数与标准IO库函数

Linux中,文件有为操作系统和设备提供了一个简单而统一的接口。在Linux中,几乎一切都可以看做文件 。 Linux对文件的操作有两种方式文件IO函数(系统调用)和标准IO库函数调用。系统调用是最直接的方式,库函数调用最终也是通过系统调用实现的。可认为库函数调用是对系统调出于效率考虑而做出的优化。 二者区别: 系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。 库

Gouhailiang的博客 2428

文件IO与标准IO操作函数

1.定义 标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标 准函数包和stdio.h头中的定义,具有一定的可移植性。标准IO库处理很多细节。例如缓存分配,以优化长度执行IO等。标准的IO提供了三种类型的缓存。 (1)全缓存:当填满标准IO缓存后才进行实际的IO操作。 (2)行缓存:当输入或输出中遇到新行符时,标准IO库执行IO操作。 (3)不带缓存:只要用户调用该函数,就会写到...

XBlog 1476

IO编程-文件IO、目录IO、时间相关函数接口

本文摘要:介绍了文件IO、目录IO以及时间相关的函数接口

y08270130的博客 590

文件IO的其他常用函数总结(Linux)

文件IO的其他常用函数总结

2403_82436914的博客 2056

8.1IO进程线程——文件IO函数

【代码】8.1IO进程线程——文件IO函数。

2303_78618914的博客 416

文件IO及常用函数

没有缓冲机制,每一次读写文件都会进行一次系统调用, 操作文件用的是文件描述符。 可以操作linux下的所有文件类型。 文件IO指的就是系统调用函数接口,不同的操作系统系统调用函数接口不同,标准IO是在文件IO之前封装的libc库函数。

m0_74937538的博客 330

IO函数;文件IO函数实现文件的拷贝;标准IO函数实现图片的拷贝;计算文件大小;0801

【代码】IO函数;文件IO函数实现文件的拷贝;标准IO函数实现图片的拷贝;计算文件大小;0801。

XMZH03042的博客 206

Linux 文件IO学习之open函数深入了解

萌新0.1

m0_61167558的博客 9928

软件编程2-IO3-文件IO、目录IO、时间相关函数接口

本文介绍了Linux系统下的文件IO和目录IO操作。文件IO部分详细讲解了基本概念、系统调用与库函数的区别,以及open/close/read/write/lseek等核心函数的使用方法。通过代码示例演示了文件偏移量定位和文件拷贝的实现。目录IO部分简要说明了目录操作的基本流程。此外,还介绍了时间相关的三类时间表示方式(time_t、struct tm和字符串时间)及其应用场景。文章内容涵盖Linux系统编程中的基础IO操作,为开发者提供了实用的编程参考。

DebugKitty的博客 882

linux常用文件IO函数

open函数功能:打开文件,如果文件不存在则可以选择创建。参数:pathname:文件的路径及文件名flags:打开文件的行为标志,必选项 O_RDONLY, O_WRONLY, O_RDWRmode:这个参数,只有在文件不存在时有效,指新建文件时指定文件的权限返回值:成功:成功返回打开的文件描述符失败:-1可选项,和必选项按位或起来1) 文件最终权限:mode & ~umask2) shell进程的umask掩码可以用umask命令查看。

qq_44729609的博客 510
上一篇: Linux IO——缓存区
下一篇: Linux IO编程——静态库、动态库
Liuqy-05
博客等级 码龄144天 1粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值