【IO操作】标准IO和文件IO

一.标准IO和文件IO的区别

(1)一般标准IO指的是C语言的IO操作,文件IO一般指的是Linux系统调用的IO操作。标准O因为是C语言提供的标准库,所以可以在其他操作系统平台编译后可以执行,但是文件IO只能在Linux下使用,标准IO意味着可以在多个平台移植使用。

(2)Linux的IO操作是基于文件描述符的。文件描述符是一个非负整数,用于标识打开或创建的文件。Linux提供了几个系统调用函数来进行IO操作,如open、read、write、close等。

文件的打开通过open函数完成,它返回一个文件描述符。读取文件内容使用read函数,它接受文件描述符、缓冲区地址和读取字节数作为参数,并返回实际读取的字节数。写入文件内容使用write函数,它接受文件描述符、缓冲区地址和写入字节数作为参数,并返回实际写入的字节数。关闭文件使用close函数,它接受文件描述符作为参数。

(3)C语言的IO操作是基于文件指针的。文件指针是一个指向FILE结构体的指针,该结构体描述了文件的属性和缓冲区等信息。C语言提供了一些库函数来进行IO操作,如fopen、fread、fwrite、fclose等。

文件的打开通过fopen函数完成,它返回一个文件指针。读取文件内容使用fread函数,它接受文件指针、缓冲区地址、每个元素的大小和读取元素的个数作为参数,并返回实际读取的元素个数。写入文件内容使用fwrite函数,它接受文件指针、缓冲区地址、每个元素的大小和写入元素的个数作为参数,并返回实际写入的元素个数。关闭文件使用fclose函数,它接受文件指针作为参数。

(4)标准IO和文件IO都可以用来访问文件,那么他们之间有什么区别呢?

通过文件IO读写文件时,每次操作都会执行相关系统调用。这样处理的好处是可以直接读写实际文件,坏处是频繁地系统调用会增加系统开销;而标准IO可以看做是在文件IO的基础上封装了缓冲机制,先读写缓冲区,必要时再访问实际文件,从而减少系统调用次数。

文件IO中用文件描述符表示一个打开的文件,可以访问不同类型的文件(如普通文件、设备文件和管道文件)。而标准IO中用FILE(流)表示一个打开的文件,通常只用来访问普通文件

总的来说,Linux的IO操作是底层的系统调用函数,而C语言的IO操作是基于库函数的高层封装。两者都可以用来进行文件的读写操作,但使用的方式和函数有所不同。

二.标准IO

标准IO库提供了一系列函数,用于对标准输入、输出、错误流以及文件进行操作。这些函数通常在 <stdio.h> 头文件中声明。下面是一些常用的标准IO函数以及它们的功能:

  1. fopen() 函数

    #include <stdio.h> FILE *fopen(const char *pathname, const char *mode);

    参数:
       pathname:文件路径名。
       mode:文件打开模式,可以取以下值:
          "r":只读模式打开文件。
          "w":只写模式打开文件,如果文件不存在则创建文件,如果文件已存在则清空文件。
          "a":追加模式打开文件,如果文件不存在则创建文件。
          "r+":读写模式打开文件。
          "w+":读写模式打开文件,如果文件不存在则创建文件,如果文件已存在则清空文件。
          "a+":读写模式打开文件,如果文件不存在则创建文件,并在文件末尾追加数据。
    更多模式可以查阅相关文档。
    返回值:返回一个文件指针(FILE *),用于后续的文件操作。如果打开文件失败,返回 NULL,并设置 errno 来指示错误原因。
    常见用法:用于打开文件,获取文件指针,以便后续的文件操作。

  2. fclose() 函数

    #include <stdio.h> 
    int fclose(FILE *stream);
    参数:stream:文件指针,需要关闭的文件。
    返回值:返回 0 表示成功关闭文件,返回 EOF 表示失败,并设置 errno 来指示错误原因。
    常见用法:用于关闭一个已经打开的文件。
    
  3. fread() 函数

    #include <stdio.h> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

    参数:
       ptr:指向存储读取数据的缓冲区。
       size:每个数据项的大小(以字节为单位)。
       nmemb:要读取的数据项的数量。
       stream:文件指针,指向要读取数据的文件。
    返回值:返回实际读取的数据项数量,如果到达文件末尾或出错返回值小于 nmemb,同时设置 errno 来指示错误原因。
    常见用法:用于从文件中读取数据。

  4. fwrite() 函数

    #include <stdio.h> size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

    参数:
        ptr:指向要写入数据的缓冲区。
       size:每个数据项的大小(以字节为单位)。
       nmemb:要写入的数据项的数量。
       stream:文件指针,指向要写入数据的文件。
    返回值:返回实际写入的数据项数量,如果出错返回值小于 nmemb,同时设置 errno 来指示错误原因。
    常见用法:用于向文件中写入数据。

  5. fseek() 函数

    #include <stdio.h> 
    int fseek(FILE *stream, long offset, int whence);
    参数:stream:文件指针,指向要定位的文件。offset:偏移量。whence:偏移起始位置,可以取以下值:SEEK_SET:文件开头。SEEK_CUR:当前文件位置。SEEK_END:文件末尾。
    返回值:返回 0 表示成功,返回非 0 表示失败,并设置 errno 来指示错误原因。
    常见用法:用于在文件中移动文件指针。
    

 

#include <stdio.h>int main() 
{FILE *fp;char buffer[100];// 打开一个文件来写入数据fp = fopen("example.txt", "w");if (fp == NULL) {printf("无法打开文件\n");return 1;}fprintf(fp, "这是一个用于示例的文件\n");fclose(fp);// 打开文件来读取数据fp = fopen("example.txt", "r");if (fp == NULL) {printf("无法打开文件\n");return 1;}fgets(buffer, 100, fp);printf("读取的内容: %s", buffer);fclose(fp);return 0;
}

 执行结果:

这是一个用于示例的文件

三.文件IO 

在Linux系统中,文件I/O操作通常使用系统调用来实现。下面是一些常见的Linux文件I/O系统调用以及它们的功能:

好的,我会重新整理一下,详细说明每个函数的参数、返回值以及常见用法:

  1. open() 函数

    #include <fcntl.h> 
    int open(const char *pathname, int flags, mode_t mode);
    参数:pathname:文件路径名。flags:文件打开标志,可以取以下值的组合:O_RDONLY:只读模式打开文件。O_WRONLY:只写模式打开文件。O_RDWR:读写模式打开文件。O_CREAT:如果文件不存在,则创建文件。O_TRUNC:如果文件存在且为只写或读写打开,则将文件长度截断为 0,即清空文件内      容。O_APPEND:在文件末尾追加数据。等等,还有其他的标志,可根据需要组合使用。mode:文件权限,仅在 O_CREAT 标志被设置时有效,通常为八进制数。
    返回值:返回一个新的文件描述符(非负整数),如果打开文件失败,返回 -1,并设置 errno 来指示错误原因。常见用法:用于打开文件,获取文件描述符,以便后续的文件操作。
  2. close() 函数

    #include <unistd.h> 
    int close(int fd);
    参数:fd:文件描述符,需要关闭的文件。
    返回值:返回 0 表示成功关闭文件,返回 -1 表示失败,并设置 errno 来指示错误原因。常见用法:用于关闭一个已经打开的文件。
  3. read() 函数

    #include <unistd.h> 
    ssize_t read(int fd, void *buf, size_t count);
    参数:fd:文件描述符。buf:用于存放读取数据的缓冲区。count:要读取的字节数。
    返回值:返回实际读取的字节数,如果到达文件末尾返回 0,出错返回 -1,并设置 errno 来指示错误原因。常见用法:用于从文件中读取数据。
  4. write() 函数

    #include <unistd.h> ssize_t write(int fd, const void *buf, size_t count);

    • 参数:

      • fd:文件描述符。
      • buf:要写入的数据。
      • count:要写入的字节数。
    • 返回值:返回实际写入的字节数,出错返回 -1,并设置 errno 来指示错误原因。

    • 常见用法:用于向文件中写入数据。

  5. lseek() 函数

    #include <unistd.h> 
    off_t lseek(int fd, off_t offset, int whence);
    参数:fd:文件描述符。offset:偏移量。whence:偏移起始位置,可以取以下值:SEEK_SET:文件开头。SEEK_CUR:当前文件位置。SEEK_END:文件末尾。
    返回值:返回新的文件偏移量(以字节为单位),出错返回 -1,并设置 errno 来指示错误原因。常见用法:用于在文件中移动文件指针。
  6. fcntl() 函数

    #include <fcntl.h>
    int fcntl(int fd, int cmd, ... /* arg */ );

    参数:
         fd:文件描述符。
         cmd:操作指令,可以取以下值:

                  F_SETFD:设置文件描述符标志。

                  F_GETFD:获取文件描述符标志。

                  F_SETFL:设置文件状态标志。

                  F_GETFL:获取文件状态标志。

                 F_DUPFD:复制文件描述符。

    返回值:根据操作指令的不同有不同的含义,出错返回 -1,并设置 errno 来指示错误原因。

    常见用法:用于对文件描述符进行各种控制操作,如设置文件状态标志、获取文件状态标志等。


    如果 cmd 参数需要额外的参数,则需要将其作为可变参数传递给 fcntl() 函数。

    等等,还有其他的操作指令,具体可以查阅相关文档

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>#define BUFFER_SIZE 1024int main() {int fd;char buffer_write[BUFFER_SIZE];char buffer_read[BUFFER_SIZE];ssize_t bytes_read;// 创建一个示例文件并写入内容fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("无法创建文件");return 1;}strcpy(buffer_write,"这是一个示例文件");write(fd, buffer_write, strlen(buffer_write));close(fd);// 打开文件来读取数据fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("无法打开文件");return 1;}// 逐步读取文件内容while ((bytes_read = read(fd, buffer_read, BUFFER_SIZE)) > 0) {write(STDOUT_FILENO, buffer_read, bytes_read); // 将读取的内容直接写入标准输出}if (bytes_read == -1) {perror("读取文件失败");close(fd);return 1;}// 关闭文件close(fd);return 0;
}

 执行结果:

这是一个示例文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1410385.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

设计编程网站集:真空成型工艺+真空成型机DIY

真空成型工艺 真空成型工艺是一种广泛应用于制造领域的工艺&#xff0c;主要用于制造复杂形状的塑料制品。真空成型工艺具有成本低、生产效率高、制品质量稳定等优点&#xff0c;因此在汽车、电子、医疗器械等行业得到广泛应用&#xff08;还可以用来制作面具&#xff0c;哈哈哈…

满上! —— 十年之约#22(ROI 48%)

原创 | 刘教链 空头在忍耐了很久之后&#xff0c;趁五一劳动节东方放假发动突袭&#xff0c;把BTC&#xff08;比特币&#xff09;打到6万刀以下。这使得我们终于终结了7个月七连涨的趋势&#xff0c;确定4月以收跌结束。 4月开盘70k&#xff0c;最高72.8k&#xff0c;最低59.6…

[随记]Mac安装Docker及运行开源Penpot

下载Docker Desktop for Mac&#xff1a;https://www.docker.com/products/docker-desktop/ 安装Docker Desktop for Mac&#xff0c;安装完成后&#xff0c;启动Docker&#xff0c;然后在终端输入&#xff1a; docker version 在Mac电脑的Desktop&#xff0c;随便创建一个文…

springBootAdmin监控

简介 用于对 Spring Boot 应用的管理和监控。可以用来监控服务是否健康、是否在线、以及一些jvm数据等等 Spring Boot Admin 分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client)&#xff0c;服务端和客户端之间采用 http 通讯方式实现数据交互&#xf…

Java中使用Redis实现分布式锁的三种方式

1. 导语 随着软件开发领域的不断演进,并发性已经成为一个至关重要的方面,特别是在资源跨多个进程共享的分布式系统中。 在Java中,管理并发性对于确保数据一致性和防止竞态条件至关重要。 Redis作为一个强大的内存数据存储,为在Java应用程序中实现分布式锁提供了一种高效的…

LeetCode-网络延迟时间(Dijkstra算法)

每日一题 今天刷到一道有关的图的题&#xff0c;需要求单源最短路径&#xff0c;因此使用Dijkstra算法。 题目要求 有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 …

Noisy:一款功能强大的DNS和HTTPS网络流量噪声生成工具

关于Noisy Noisy是一款功能强大的DNS和HTTP/S网络流量噪音生成工具&#xff0c;该工具基于Python开发&#xff0c;可以帮助广大研究人员在进行常规网络浏览时&#xff0c;在后台生成随机的HTTP/DNS网络流量噪声&#xff0c;并以此来提升网络通信数据的安全性和隐蔽性。 支持的…

WSL2连接Windows主机的Mysql

文章目录 需求查看主机IP防火墙设置Mysql设置允许远程连接WSL2连接Mysql 需求 在WSL2&#xff08;本机Ubuntu20.04&#xff09;运行的程序需要将数据写入到本机的Mysql服务器中 查看主机IP 两种办法&#xff1a; Windows主机输入 ipconfig&#xff0c;找到带有WSL后缀的部分…

《十二》Qt各种对话框之FileDialog文件对话框及QMessageBox 消息对话框

QFileDialog 对话框 选择打开一个文件 若要打开一个文件&#xff0c;可调用静态函数 QFileDialog::getOpenFileName()&#xff0c;“打开一个文件”按钮的响应代码如下&#xff1a; void Dialog::on_btnOpen_clicked() { //选择单个文件QString curPathQDir::currentPath()…

如何利用ChatGPT撰写满分文案:技巧与实例解析

在当今社会&#xff0c;随着企业越来越重视宣传推广&#xff0c;文案写作已成为关键的营销手段之一。同时&#xff0c;人工智能的快速发展为文案创作提供了新的工具和方法。例如&#xff0c;ChatGPT这种基于自然语言处理的模型&#xff0c;在协助撰写多种文案方面展现出了极大的…

【智能算法】冠豪猪优化算法(CPO)原理及实现

1.背景 2024年&#xff0c;M Abdel-Basset等人受到冠豪猪防御行为启发&#xff0c;提出了冠豪猪优化算法&#xff08;Crested Porcupine Optimizer, CPO&#xff09;。 2.算法原理 2.1算法思想 CPO使用四种不同的保护机制:视觉、声音、气味和物理攻击。第一和第二防御策略(视…

Linux实训-用户和组的管理

实训1&#xff1a;用户的管理 创建一个新用户user1&#xff0c;设置其主目录为/home/user1。查看/etc/passwd文件的最后一行&#xff0c;看看是如何记录的。查看文件/etc/shadow文件的最后一行&#xff0c;看看如何记录的。给用户user1设置密码。再次查看文件/etc/shadow文件的…

暗区突围端游海外版|暗区突围怎么玩 新手游玩攻略分享

游戏中健康系统与其它射击游戏有很大区别&#xff0c;根据受伤部位、伤势的不同&#xff0c;会有不同的表现。除了头部之外&#xff0c;其它部位如果损坏后继续受到伤害&#xff0c;那么伤害将会分摊到身体其它部位。在暗区内或者暗区外都可以对角色进行治疗&#xff0c;角色不…

【算法入门教育赛1D】环形密码 - 字符串 | C++题解与代码

题目链接&#xff1a;https://www.starrycoding.com/problem/161 题目描述 小 e e e有一个宝箱&#xff0c;这个宝箱有一个长度为 n n n的密码&#xff0c;但是这个密码校验器是一个环形&#xff0c;意思是只要密码从任意一位开始读&#xff08;读到最后一位回到第一位继续&a…

【Canvas与艺术】自制朝阳电脑桌面(1920*1080)

【关键点】 线性渐变色绘制天空&#xff0c;径向渐变色绘制太阳&#xff0c;半透明色制作光芒。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/&g…

Docker 安装部署 postgres

Docker 安装部署 postgres 1、拉取 postgres 镜像文件 [rootiZbp19a67kznq0h0rgosuxZ ~]# docker pull postgres:latest latest: Pulling from library/postgres b0a0cf830b12: Pull complete dda3d8fbd5ed: Pull complete 283a477db7bb: Pull complete 91d2729fa4d5: Pul…

2023上半年软件设计师上午题——防火墙

防火墙知识点总结 网络级防火墙层次低&#xff0c;但是效率高&#xff0c;因为其使用包过滤和状态监测手段&#xff0c;一般只检验网络包外在 (起始地址、状态) 属性是否异常 , 若异常则过滤掉 , 不与内网通信,因此对应用和用户是透明的。但是这样的问题是&#xff0c;如果遇到…

Redis---------实现查询缓存业务

目录 数据库与缓存之间的工作业务逻辑&#xff1a; 接下来看查询缓存代码实现&#xff0c;主要是捋清楚业务逻辑&#xff0c;代码实现是死的&#xff1a; Controller: Service: P37作业实现&#xff1a;总体逻辑跟上面的业务逻辑差不多 Controller&#xff1a; Service&#…

由于找不到vcruntime140_1.dll无法继续执行此代码的8个解决方法

vcruntime140_1.dll 是一个动态链接库&#xff08;Dynamic Link Library&#xff09;文件&#xff0c;它是Microsoft Visual C Redistributable包的一部分&#xff0c;特别与Visual Studio 2015及之后版本的C运行时环境关联紧密。此文件包含了执行基于Visual C开发的应用程序所…

如何快速的追加文章的内容(在不知道内容的情况下)

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、打开工具&#xff0c;切换到文章模块下&#xff0c;快捷键&#xff1a;Ctrl1 2、新建一个文章做演示&#xff0c;001 3、添加一个内容&#xff0c;就随…