C 风格文件输入/输出 (std::fopen)(std::freopen)(std::fclose)

news2024/11/26 18:32:49

文件访问

打开文件

std::fopen

std::FILE* fopen( const char* filename, const char* mode );

打开 filename 所指示的文件并返回与该文件关联的流。用 mode 确定文件访问模式。

参数

filename-要关联文件流到的文件名
mode-确定文件访问模式的空终止字符串
文件访问模式字符串含义解释若文件已存在的行动若文件不存在的行动
"r"为读取打开文件从起始读取打开失败
"w"为写入创建文件销毁内容创建新文件
"a"追加追加到文件写入到末尾创建新文件
"r+"扩展读为读取/写入打开文件从起始读取错误
"w+"扩展写为读取/写入创建文件销毁内容创建新文件
"a+"扩展追加为读取/写入打开文件写入到末尾创建新文件
文件访问模式标志 "b" 能可选地指定,以用二进制模式打开文件。此标志在 POSIX 系统上无效果,但例如在 Windows 上,它禁用 '\n' 和 '\x1A' 的特殊处理。
在追加文件访问模式上,写入数据到文件尾,忽略文件位置指示器的当前位置。
文件访问模式标志 "x" 能可选地追加到 "w" 或 "w+" 指定符。此标志强制函数在文件存在的情况下失败,而非重写文件。(C++17)
若模式不是以上字符串之一,则行为未定义。一些实现定义额外的

返回值

若成功,则返回指向控制打开的文件流的对象的指针,并清除文件尾和错误位。流为完全缓冲,除非 filename 指代交互设备。

错误时,返回空指针。 POSIX 要求此情况下设置 errno 。

注意

filename 的格式是实现定义的,且不必指代一个文件(例如它可以是控制台或另一能通过文件系统 API 访问的设备)。在支持的平台上, filename 可包含绝对或相对文件系统路径。

可移植的目录和文件命名,见 C++ 文件系统库或 boost.filesystem 。

调用示例

#include <cstdio>
#include <cstdlib>

int main()
{
    FILE* fp = std::fopen("test.txt", "r");
    if (!fp)
    {
        std::perror("File opening failed");
        return EXIT_FAILURE;
    }

    int c; // 注意:是 int 而非 char ,要求处理 EOF
    while ((c = std::fgetc(fp)) != EOF)   // 标准 C I/O 文件读取循环
    {
        std::putchar(c);
    }

    if (std::ferror(fp))
    {
        std::puts("I/O error when reading");
    }
    else if (std::feof(fp))
    {
        std::puts("End of file reached successfully");
    }

    std::fclose(fp);
    return 0;
}

输出

以不同名称打开既存流

std::freopen

std::FILE* freopen( const char* filename, const char* mode, std::FILE* stream );

首先,试图关闭与 stream 关联的文件,忽略任何错误。然后,若 filename 非空,则试图用 mode 打开 filename 所指定的文件,如同用 fopen ,然后将该文件与 stream 所指向的文件流关联。若 filename 为空指针,则函数试图重打开已与 stream 关联的文件(此情况下是否允许模式改变是实现定义的)。

参数

filename-要关联文件流到的文件
mode-确定新文件打开模式的空终止字符串

文件访问模式字符串含义解释若文件已存在的行动若文件不存在的行动
"r"为读取打开文件从起始读取打开失败
"w"为写入创建文件销毁内容创建新文件
"a"追加追加到文件写入到末尾创建新文件
"r+"扩展读为读取/写入打开文件从起始读取错误
"w+"扩展写为读取/写入创建文件销毁内容创建新文件
"a+"扩展追加为读取/写入打开文件写入到末尾创建新文件
文件访问模式标志 "b" 能可选地指定,以用二进制模式打开文件。此标志在 POSIX 系统上无效果,但例如在 Windows 上,它禁用 '\n' 和 '\x1A' 的特殊处理。
在追加文件访问模式上,写入数据到文件尾,忽略文件位置指示器的当前位置。
文件访问模式标志 "x" 能可选地追加到 "w" 或 "w+" 指定符。此标志强制函数在文件存在的情况下失败,而非重写文件。(C++17)
若模式不是以上字符串之一,则行为未定义。一些实现定义额外的支持模式(例如 MSVC )。

stream-要修改的文件流

返回值

成功时为 stream ,失败时为 NULL 。

注意

freopen 是一旦由 I/O 操作或 std::fwide 建立面向后,改变流窄/宽面向的唯一方式。

调用示例

#include <cstdio>

int main()
{
    std::printf("stdout is printed to console\n");
    if (std::freopen("redir.txt", "w", stdout))
    {
        std::printf("stdout is redirected to a file\n"); // 这被写入 redir.txt
        std::fclose(stdout);
    }
    return 0;
}

 输出

关闭文件

std::fclose

int fclose( std::FILE* stream );

关闭给定的文件流。冲入任何未写入的缓冲数据到 OS 。舍弃任何未读取的缓冲数据。

无论操作是否成功,流都不再关联到文件,且由 std::setbuf 或 std::setvbuf 分配的缓冲区若存在,则亦被解除关联,并且若使用自动分配则被解分配。

若在 fclose 返回后使用 stream 的值则行为未定义。

参数

stream-要关闭的文件流

返回值

成功时为 ​0​ ,否则为 EOF 。

调用示例

#include <cstdio>
#include <cstdlib>

int main()
{
    FILE* fp = std::fopen("test.txt", "r");
    if (!fp)
    {
        std::perror("File opening failed");
        return EXIT_FAILURE;
    }

    int c; // 注意:是 int 而非 char ,要求处理 EOF
    while ((c = std::fgetc(fp)) != EOF)   // 标准 C I/O 文件读取循环
    {
        std::putchar(c);
    }

    if (std::ferror(fp))
    {
        std::puts("I/O error when reading");
    }
    else if (std::feof(fp))
    {
        std::puts("End of file reached successfully");
    }

    std::fclose(fp);
    return 0;
}

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

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

相关文章

sql:SQL优化知识点记录(十一)

&#xff08;1&#xff09;用Show Profile进行sql分析 新的一个优化的方式show Profile 运行一些查询sql&#xff1a; 查看一下我们执行过的sql 显示sql查询声明周期完整的过程&#xff1a; 当执行过程出现了下面这4个中的时&#xff0c;就会有问题导致效率慢 8这个sql创建…

【图解RabbitMQ-3】消息队列RabbitMQ介绍及核心流程

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

linux线程讲解

1.线程概述 一个进程在同一时刻只做一件事情&#xff0c;进程是程序执行的一个实例。 线程是操作系统能够进行运算调度的最小单位&#xff0c;一个进程中可以并发多个线程&#xff0c;每条线程并行执行不同的任务。 进程&#xff1a;资源分配的最小单位。线程&#xff0c;程…

【vue2第十四章】 插槽(普通插槽、具名插槽、作用域插槽语法)

插槽 插槽是什么&#xff1f; 在 Vue 2 中&#xff0c;插槽&#xff08;slot&#xff09;是一种用于定义组件内部内容分发的机制。它允许你将组件中的一部分内容替换为用户自定义的内容&#xff0c;并在组件内部进行渲染。 通过在组件模板中使用 <slot></slot> 标…

yml配置动态数据源(数据库@DS)与引起(If you want an embedded database (H2, HSQL or Derby))类问题

1&#xff1a;yml 配置 spring:datasource:dynamic:datasource:master:url: jdbc:mysql://192.168.11.50:3306/dsdd?characterEncodingUTF-8&useUnicodetrue&useSSLfalse&tinyInt1isBitfalse&allowPublicKeyRetrievaltrue&serverTimezoneUTCusername: ro…

Ceph PG Peering数据修复

ceph数据修复 当PG完成了Peering过程后&#xff0c;处于Active状态的PG就可以对外提供服务了。如果该PG的各个副本上有不一致的对象&#xff0c;就需要进行修复。 Ceph的修复过程有两种&#xff1a;Recovery和Backfill。 Recovery是仅依据PG日志中的缺失记录来修复不一致的对…

Vue进阶(六十七)页面刷新路由传参丢失问题分析及解决

文章目录 一、前言二、问题排查三、延伸阅读3.1 Apache服务器access_log日志3.2 浏览器的常见User Agent 各字段的解释 一、前言 问题描述&#xff1a;Vue项目上线后&#xff0c;在IE浏览器上&#xff0c;从A页面跳转至B页面&#xff0c;B页面通过data中接收来自A页面的参数信…

JavaScript简称“JS”简单介绍

JavaScript简称“JS” JavaScript&#xff08;简称“JS”&#xff09;是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。虽然它是作为 开发 Web 页面的脚本语言而出名&#xff0c;但是它也被用到了很多非浏览器环境中&#xff0c; JavaScript 基于原型编…

使用自定义注解和SpringAOP捕获Service层异常,并处理自定义异常

目录 一 自定义异常二 自定义注解三 注解切面处理类四 使用 一 自定义异常 /*** 自定义参数为null异常*/ public class NoParamsException extends Exception {//用详细信息指定一个异常public NoParamsException(String message){super(message);}//用指定的详细信息和原因构…

Matlab图像处理-低通滤波

低通滤波 频域低通滤波法可以去除或削弱图像的高频成分&#xff0c;以去掉噪声使图像平滑。 理想低通滤波器是指输入信号在通带内所有频率分量完全无损地通过&#xff0c;而在阻带内所有频率分量完全衰减。 低通滤波的效果是图像去噪声平滑增强&#xff0c;但同时也抑制了图…

关于10月份美国FDA化妆品强制注册通知要求及注意事项

根据美国法律&#xff0c;产品是化妆品还是药物取决于产品的预期用途。如果商品是化妆品用途&#xff0c;那FDA要求产品在FDA系统上进行申报即可&#xff1b;如果化妆品带有药用功效&#xff0c;在查验时要出具FDA正本。 1.所有在美市场流通的化妆品制造商皆须于2023/12/29前完…

nuxt3项目使用pdfjs-dist预览pdf

使用的包的源代码是 pdfjs - npm 但是我们实际上项目中使用的是pdfjs打包后的dist文件&#xff0c;也就是pdfjs-dist - npm 所以我们需要使用这个命令 npm i pdfjs-dist 我们可以克隆pdfjs这个包来看源代码&#xff0c;里面有使用的例子&#xff0c;也可以根据源代码自己打…

18|乐观豁达:黄州重生的苏轼

好诗相伴&#xff0c;千金不换。你好&#xff0c;我是天博。 从这一讲开始&#xff0c;我们进入了这门课的最后一个主题&#xff1a;“见自己”。在这个主题里&#xff0c;我们会把重点放在“诗词给了我们什么”上&#xff0c;也就是怎样从诗词里汲取对我们有帮助的精神力量。…

中级深入--day19

鼠标动作链 有些时候&#xff0c;我们需要再页面上模拟一些鼠标操作&#xff0c;比如双击、右击、拖拽甚至按住不动等&#xff0c;我们可以通过导入 ActionChains 类来做到&#xff1a; 示例&#xff1a; #导入 ActionChains 类 from selenium.webdriver import ActionChains…

异步编程 - 01 漫谈异步编程发展史

文章目录 同步编程vs异步编程异步编程小故事单JVM异步地处理一些事情&#xff0c;而不需要知道异步任务的结果主线程等待异步任务的执行结果Future确实可以获取异步任务的执行结果&#xff0c;但是获取其结果还是会阻塞调用线程的&#xff0c;并没有实现完全异步化处理 --> …

LabVIEW应用开发——LabVIEW2019保姆级介绍、安装、第一个程序

一、前言 LabVIEW是一种程序开发环境&#xff0c;由美国国家仪器&#xff08;NI&#xff09;公司研制开发&#xff0c;类似于C和BASIC开发环境&#xff0c;但是LabVIEW与其他计算机语言的显著区别是&#xff1a;其他计算机语言都是采用基于文本的语言产生代码&#xff0c;而Lab…

JavaSE-日志

世上只有想不通的人&#xff0c;没有走不通的路。 文章目录 1. 日志概述2. Logback日志框架3. Logback快速入门4. Logback配置详解输出位置设置日志级别设置 1. 日志概述 通过日志可以查看程序运行的过程和详情。 输出语句的弊端&#xff1a; 信息只能展示在控制台。不能将其记…

java读取服务器数据包并下载至本地目录

jsch包如果没有的话&#xff0c;可评论联系我&#xff0c;我私发给你&#xff0c;或者通过https://mvnrepository.com/artifact/com.jcraft/jsch/0.1.55进行下载&#xff0c;添加至工程目录 package com.hbisdt.dqbasic.modular.util;import com.jcraft.jsch.*;import java.i…

OpenShift 4 - 利用 OpenShift 的 OAuth Proxy 实现应用身份认证

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.13 的环境中验证 文章目录 部署测试应用只有认证用户才能访问只有有权的用户才能访问使用 ServiceAccount 访问参考 说明&#xff1a; 本文需要集群中除了管理员外还有一个一般用户。另外除…

Leetcode 1486.数组异或操作

给你两个整数&#xff0c;n 和 start 。 数组 nums 定义为&#xff1a;nums[i] start 2*i&#xff08;下标从 0 开始&#xff09;且 n nums.length 。 请返回 nums 中所有元素按位异或&#xff08;XOR&#xff09;后得到的结果。 示例 1&#xff1a; 输入&#xff1a;n 5, …