3. Linux标准I/O库

Linux 标准 I/O(Standard I/O)库提供了一组函数,用于进行高级别的文件输入和输出操作。它建立在底层文件 I/O 系统调用之上,为开发者提供了更方便、更高级别的文件处理方式。以下是一些常用的 Linux 标准 I/O 库函数:

1. 文件指针

标准 I/O 使用 FILE 结构表示文件流,通过文件指针(FILE*)进行操作。FILE 结构包含了文件的缓冲区、文件描述符、文件位置指示器等信息。

2. 文件打开和关闭

  • FILE* fopen(const char* filename, const char* mode);

    • 打开文件,并返回一个文件指针。
    • filename 是文件名。
    • mode 指定打开文件的模式(例如:“r” - 只读,“w” - 只写,“a” - 追加,“r+” - 读写,“w+” - 读写,“a+” - 读写追加等)。
  • int fclose(FILE* stream);

    • 关闭文件流,释放相关资源。
#include <stdio.h>int main() {// 打开文件FILE* file = fopen("example.txt", "r");if (file != NULL) {// 文件操作...// 关闭文件fclose(file);} else {perror("Error opening file");}return 0;
}

3. 文件读写

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

    • 从文件读取数据到缓冲区。
    • ptr 是数据缓冲区的指针。
    • size 是每个数据项的大小。
    • nmemb 是要读取的数据项数量。
    • stream 是文件指针。
  • size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);

    • 将数据从缓冲区写入文件。
    • ptr 是数据缓冲区的指针。
    • size 是每个数据项的大小。
    • nmemb 是要写入的数据项数量。
    • stream 是文件指针。
#include <stdio.h>int main() {FILE* file = fopen("example.txt", "w");if (file != NULL) {// 写入数据const char* data = "Hello, Standard I/O!";fwrite(data, sizeof(char), strlen(data), file);// 关闭文件fclose(file);} else {perror("Error opening file");}return 0;
}

4. 标准输入输出

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

    • 将格式化的数据写入文件。
  • int fscanf(FILE* stream, const char* format, ...);

    • 从文件中读取格式化的数据。
  • int printf(const char* format, ...);

    • 将格式化的数据写入标准输出。
  • int scanf(const char* format, ...);

    • 从标准输入读取格式化的数据。
#include <stdio.h>int main() {FILE* file = fopen("example.txt", "w");if (file != NULL) {// 将格式化的数据写入文件fprintf(file, "The answer is: %d\n", 42);// 关闭文件fclose(file);} else {perror("Error opening file");}return 0;
}

5. 标准错误输出

  • int perror(const char* s);
    • 输出一个错误消息。
#include <stdio.h>int main() {FILE* file = fopen("nonexistent_file.txt", "r");if (file == NULL) {// 输出错误消息perror("Error opening file");}return 0;
}

6. 标准输入输出重定向

  • int fflush(FILE* stream);

    • 刷新缓冲区。
  • int setvbuf(FILE* stream, char* buffer, int mode, size_t size);

    • 设置文件流的缓冲区。
  • int fseek(FILE* stream, long offset, int whence);

    • 移动文件位置指示器。
#include <stdio.h>int main() {FILE* file = fopen("example.txt", "w");if (file != NULL) {// 写入数据fprintf(file, "Hello, Standard I/O!");// 刷新缓冲区fflush(file);// 移动文件位置指示器fseek(file, 0, SEEK_SET);// 关闭文件fclose(file);} else {perror("Error opening file");}return 0;
}

7. 标准输入输出缓冲

标准 I/O 库使用缓冲区来提高性能。默认情况下,标准输入(stdin)和标准输出(stdout)是行缓冲的,而标准错误输出(stderr)是无缓冲的。

  • 行缓冲:当遇到换行符 \n 时,缓冲区会被刷新。
  • 全缓冲:当缓冲区满时,或者使用 fflush 函数时,缓冲区会被刷新。
#include <stdio.h>int main() {// 默认为行缓冲,当遇到换行符时,缓冲区被刷新printf("Hello, ");  // 不会立即输出// 刷新缓冲区fflush(stdout);  // 输出 "Hello, "// 全缓冲,缓冲区满时被刷新printf("World!");  // 不会立即输出// 刷新缓冲区fflush(stdout);  // 输出 "World!"return 0;
}

8. 标准输入输出重定向

标准输入输出重定向允许程序从不同的源读取输入或将输出发送到不同的目标。这在命令行中特别有用。

  • 标准输入重定向:./program < input.txt

    • 程序从 input.txt 中读取输入。
  • 标准输出重定向:./program > output.txt

    • 程序将输出写入到 output.txt
#include <stdio.h>int main() {// 从标准输入读取数据int number;scanf("%d", &number);printf("You entered: %d\n", number);// 将输出重定向到文件freopen("output.txt", "w", stdout);printf("This will be written to output.txt\n");return 0;
}

9. 标准输入输出流的复制

通过 dupdup2 函数,可以复制文件描述符,实现标准输入输出流的重定向。

  • int dup(int oldfd);

    • 复制文件描述符,返回新的文件描述符。
  • int dup2(int oldfd, int newfd);

    • 复制文件描述符到指定的文件描述符,如果指定的文件描述符已经打开,则关闭它。
#include <stdio.h>
#include <unistd.h>int main() {// 复制标准输出流到文件描述符 3int newfd = dup(STDOUT_FILENO);// 输出到标准输出和新的文件描述符printf("Hello, Standard Output!\n");dprintf(newfd, "Hello, New File Descriptor!\n");// 关闭新的文件描述符close(newfd);return 0;
}

10. 标准错误输出

标准错误输出流 stderr 通常用于输出程序运行时的错误消息。

#include <stdio.h>int main() {fprintf(stderr, "This is an error message.\n");perror("An error occurred");return 0;
}

以上是 Linux 标准 I/O 库的一些高级特性,包括缓冲机制、输入输出重定向和文件描述符的复制。这些特性使得标准 I/O 库更加灵活,适用于各种输入输出场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust生命周期和生命周期声明‘作用Missing lifetime specifier

Missing lifetime specifier&#xff1a;报错说明缺失声明周期声明 Rust 生命周期机制是与所有权机制同等重要的资源管理机制。 之所以引入这个概念主要是应对复杂类型系统中资源管理的问题。 引用是对待复杂类型时必不可少的机制&#xff0c;毕竟复杂类型的数据不能被处理器…

如何开展自动化测试框架的构建

自动化测试框架的构建是一个系统性的过程&#xff0c;它涉及到多个层面的考虑和实施。以下是一些关键步骤和策略&#xff0c;帮助你开展自动化测试框架的构建&#xff1a; 需求分析&#xff1a; 深入了解业务需求&#xff0c;明确测试目标。分析现有的测试流程和测试用例&…

UDP连接树莓派时提高连接速度,降低卡顿感

背景 树莓派4B刷的是ubuntu20.4系统&#xff0c;使用win10自带的远程桌面连接和其连接&#xff0c;卡的一批&#xff0c;于是探索并记录下如何降低连接卡顿感 步骤一 点击显示选项&#xff0c; 降低显示配置和颜色深度&#xff1a; 步骤二 我的树莓派是通过电脑移动热点的方式…

Qt+FFmpeg+opengl从零制作视频播放器-13.打包为exe包发布软件

1.首先visual studio给生成程序添加桌面图标。 右键工程,添加新文件资源文件Resource.rc 选择导入文件,我这里导入了Player.ico文件。 添加后,在资源文件那里就可以看见ico文件。 然后编译release程序, 生成的可执行程序就带上了图标。 2.使用Qt 程序打包发布-windeployq…

用spark进行数据查询常用语法总结

文章目录 show&#xff1a;数据显示distinct&#xff1a;数据行数去重count&#xff1a;看行数select&#xff1a;查看具体列数据toDF&#xff1a;对字段命名(搭配常用与groupby--agg--toDF)withColumn&#xff1a;新增列名printSchema: 打印列名信息dropDuplicates&#xff1a…

AWS入门实践-AWS CLI工具的使用介绍

AWS CLI&#xff08;Amazon Web Services Command Line Interface&#xff09;是一个强大的工具&#xff0c;它允许您直接从命令行与AWS服务进行交互。这不仅可以加快许多任务的处理速度&#xff0c;而且还可以通过脚本自动化。 一、AWS CLI工具的安装 1、Windows 安装下载…

uniapp图片涂鸦插件(支持多种涂鸦方式,图片放大缩小)

工程地址https://gitee.com/geshijia/ct-graffiti ct-graffiti涂鸦组件使用说明 参考说明 参考链接&#xff1a;https://github.com/ylyuanlu/yl-graffiti 感谢作者的付出&#xff0c;给我提供了一些思路&#xff0c;并做了如下优化&#xff1a; 增加图片放大缩小移动功能添…

Qt+FFmpeg+opengl从零制作视频播放器-15.音视频一些知识

1.视频方面 本专栏只针对视频压缩数据为H.264的数据进行演示。 H264解码后的原始数据主要包括片(slice)、宏块(MB)以及YUV像素数据。 片是H264编码中的基本单元,它包含一帧图像的部分或全部数据。一个视频帧可以由一个或多个片组成,每个片最少包含一个宏块,最多可以包…

怎么读取springboot中的properties.yml配置文件里的配置值(亲测有效)

怎么读取springboot中的properties.yml配置文件里的配置值 test:username: name主配置类中加上 EnableConfigurationProperties(MailConfigProperties.class)类上加ConfigurationPropetise("test“),属性就会自动注入配置值&#xff1b; ConfigurationPropetise("…

第十四届蓝桥杯蜗牛

蜗牛 线性dp 目录 蜗牛 线性dp 先求到达竹竿底部的状态转移方程 求蜗牛到达第i根竹竿的传送门入口的最短时间​编辑 题目链接&#xff1a;蓝桥杯2023年第十四届省赛真题-蜗牛 - C语言网 关键在于建立数组将竹竿上的每个状态量表示出来&#xff0c;并分析出状态转移方程 in…

[实战]API防护破解之签名验签

前言&#xff1a; 传统的接口在传输的过程中&#xff0c;是非常容易被抓包进行篡改&#xff0c;从而进行中间人攻击。这时候我们可以通过对参数进行签名验证&#xff0c;如果参数与签名值不匹配&#xff0c;则请求不通过&#xff0c;直接返回错误信息&#xff0c;从而防止黑客…

混合A*源码解读(c++)

基于ros中通过slam建立的栅格地图&#xff0c;使用混合A*进行路径规划。 首先是run_hybrid_astar.cpp: #include "hybrid_a_star/hybrid_a_star_flow.h" #include "3rd/backward.hpp" #include <ros/ros.h>namespace backward { backward::SignalHa…

使用hashmap优化时间复杂度,leetcode1577

1577. 数的平方等于两数乘积的方法数 已解答 中等 相关标签 相关企业 提示 给你两个整数数组 nums1 和 nums2 &#xff0c;请你返回根据以下规则形成的三元组的数目&#xff08;类型 1 和类型 2 &#xff09;&#xff1a; 类型 1&#xff1a;三元组 (i, j, k) &#xff…

题目 3150: 冶炼金属

题目描述: 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V&#xff0c;V 是一个正整数&#xff0c;这意味着消耗 V 个普通金 属 O 恰好可以冶炼出一个特殊金属 X&#xff0c;当普通金属 O 的数目不足 V 时&#xff0c;无法…

OpenCV加载视频

一、加载视频 //视频路径QString appPath QCoreApplication::applicationDirPath();QString videoPath appPath "/vtest.avi";cv::VideoCapture capture;capture.open(videoPath.toStdString(),CAP_FFMPEG);//从摄像头读取//capture.open(0, CAP_DSHOW);cv::Mat f…

【趣味学算法】04_与谁结婚(逻辑推断|条件组合)

注&#xff1a; 本系列仅为个人学习笔记&#xff0c;学习内容为《算法小讲堂》&#xff08;视频传送门&#xff09;&#xff0c;通俗易懂适合编程入门小白&#xff0c;需要具备python语言基础&#xff0c;本人小白&#xff0c;如内容有误感谢您的批评指正 有三对情侣要结婚&…

带钢切割控制液压比例阀放大器

比例阀控制器放大器放大板技术是电液比例控制系统中的重要组成部分&#xff0c;它负责对比例阀进行精确控制&#xff0c;以实现对液压系统中流量、压力等参数的精细调节。可以实现对液压流量或压力的精确控制&#xff0c;从而使系统以更高的精度和更快的响应速度执行各种操作。…

以102flowers数据集为例训练ResNet50模型

以102flowers数据集为例训练ResNet50模型 使用飞桨高阶API&#xff0c;使用最少的代码量&#xff0c;实现在102flowers数据集训练ResNet50模型。同时可以一条命令修改成Mnist、Cifar10、Cifar100等数据集&#xff0c;换成其它模型也是只需要一句话代码。 数据集介绍 102flowe…

二叉排序树删(15.6)

#include <stdio.h> #include <stdlib.h> ///二叉排序树&#xff0c;中序遍历&#xff0c;查找typedef int KeyType; typedef struct BSTNode{KeyType key;struct BSTNode *lchild,*rchild; }BSTNode,*BiTree;//二叉查找树核心 //非递归创建二叉查找树 int BST_Ins…

java是不是没有指针呢?

在Java中&#xff0c;与C语言相比&#xff0c;指针的使用是受到限制的。Java的设计初衷是为了提供更高的安全性和可靠性&#xff0c;因此它采用了一些机制来避免常见的指针错误。 具体来说&#xff0c;Java中没有像C语言中那样的显式指针操作。Java中的引用可以看作是一种类似…