(C语言) 文件读写基础

news2024/11/24 15:29:30

文章目录

  • 🗂️前言
    • 📄ref
    • 📄访问标记
      • 🗃️文件访问标记
  • 🗂️Code
    • 📄demo
    • 📄分点讲解
      • 🗃️打开/关闭
      • 🗃️写
      • 🗃️读
  • 🗂️END
    • 🌟关注我

🗂️前言

📄ref

  • 文件输入/输出 - cppreference.com
  • fopen, fopen_s - cppreference.com

📄访问标记

🗃️文件访问标记

文件访问 模式字符串含义解释若文件已存在的动作若文件不存在的动作
“r”打开文件以读取从头读打开失败
“w”创建文件以写入销毁内容创建新文件
“a”后附后附到文件写到结尾创建新文件
“r+”读扩展打开文件以读/写从头读错误
“w+”写扩展创建文件以读/写销毁内容创建新文件
“a+”后附扩展打开文件以读/写写到结尾创建新文件
  • 可以可选地指定文件访问模式标记 “b” 来以二进制模式打开文件。此标在 POSIX 上没有效果,而在 Windows 系统上,它禁用了对 ‘\n’ 和 ‘\x1A’ 特殊处理。 在附加文件访问模式下,数据被写入到文件尾,而不考虑文件位置指示器的当前位置。
  • 如果模式不是以上所列字符串之一,则其行为未定义。一些实现会定义额外支持的模式(比如 Windows)。
  • 在更新模式('+')中,输入和输出均可进行,然而输出不应直接紧随输入,而中间无对 fflush、fseek、fsetpos 或 rewind 的调用,且输入不应直接紧随输出,而中间无对 fseek、fsetpos 或 rewind 的调用,除非输入操作遇到文件尾。在更新模式中,允许各实现在即便指定了文本模式时仍使用二进制模式。
  • 文件访问模式标记 “x” 可以可选地后附于 “w” 或 “w+” 指定符。若文件存在,则此标记强制函数失败,而不重写它。(C11)
  • 使用 fopen_s 或 freopen_s 时,任何以 “w” 或 “a” 创建的文件的文件访问许可均禁止其他用户访问它。文件访问模式标签 "u" 可以可选地前附于任何以 “w” 或 “a” 开始的指定符,以启用默认的 fopen 许可。(C11)

🗂️Code

📄demo

#include <stdio.h>
#include <stdlib.h>

void file_write(const char* file_path) {
    FILE* fp = fopen(file_path, "w+");
    if (NULL == fp) {
        return;
    }

    fputs("cuber-lotus", fp);
    fputc('\n', fp);
    fputc('u', fp);
    fputc('r', fp);
    fputc('l', fp);
    fputc(':', fp);
    fprintf(fp, "https://space.bilibili.com/8172252");

    if (ferror(fp)) {
        perror("Error I/O.");
    }

    fclose(fp);
}

void file_read(const char* file_path) {
    FILE* fp = fopen(file_path, "r+");
    if (NULL == fp) {
        return;
    }

#if 1
    // 按行读
    char buf[1024] = {};
    while (feof(fp) == 0) {
        fgets(buf, sizeof(buf), fp);
        printf("%s", buf);
    }
#else
    // 按字符读
    int c;
    while ((c = fgetc(fp)) != EOF) {
        putchar(c);
    }
#endif

    puts("");
    if (ferror(fp)) {
        perror("Error I/O.");
    } else if (feof(fp)) {
        puts("fp is EOF.");
    } else {
        puts("fp is not EOF.");
    }

    fclose(fp);
}

int main() {
    const char* file_path = "example.txt";
    file_write(file_path);
    file_read(file_path);
}

📄分点讲解

注意,所有操作都有多种api,比如关于print组函数可见:(C语言) print输出函数系列介绍

其实文件就是一种特殊的,如果对流的概念和操作熟悉,那么对文件的读写想必也会很很难。

🗃️打开/关闭

注意:千万必要复制FILE对象,该行为是未定义的。

FILE* fp = fopen(file_path, "w+");
fclose(fp);

🗃️写

// 写入char*
fputs("cuber-lotus", fp);
// 写入单个字符
fputc(':', fp);
// 写入char*
fprintf(fp, "https://space.bilibili.com/8172252");

🗃️读

法1:

// 按行读
char buf[1024] = {};
while (feof(fp) == 0) {
    fgets(buf, sizeof(buf), fp);
    printf("%s", buf);
}

法2:

// 按字符读
int c;
while ((c = fgetc(fp)) != EOF) {
    putchar(c);
}



🗂️END

🌟关注我

关注我,学习更多C/C++,算法,计算机知识

B站:

👨‍💻主页:天赐细莲 bilibili

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

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

相关文章

Linux-socket详解

前言 OSI七层模型和TCP/IP四层模型在这里就不说了。 套接字&#xff08;socket&#xff09;是一个抽象层&#xff0c;应用程序可以通过它发送或接收数据&#xff0c;可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将IO插入到网络中&#xff0c;并与网络…

Nest.js 实战 (四):利用 Pipe 管道实现数据验证和转换

什么是管道&#xff08;Pipe&#xff09;&#xff1f; 在 Nest.js 中&#xff0c;管道&#xff08;Pipelines&#xff09; 是一种强大的功能&#xff0c;用于预处理进入控制器方法的请求数据&#xff0c;如请求体、查询参数、路径参数等。管道允许开发者在数据到达控制器方法之…

使用GoAccess进行Web日志可视化

运行网站的挑战之一是了解您的 Web 服务器正在做什么。虽然各种监控应用程序可以在您的服务器以高负载或页面响应缓慢运行时提醒您&#xff0c;但要完全了解正在发生的事情&#xff0c;唯一的方法是查看 Web 日志。阅读日志数据页面并了解正在发生的事情可能需要花费大量时间。…

慎用 readFileSync 读取大文件, 教你一招如何优雅处理大文件读取

我们在编写 nodejs 服务的时候&#xff0c;有时候需要使用 fs.readFileSync api 去读取文件&#xff0c;但是使用 fs.readFileSync 会将文件读取在内存中&#xff0c;如果遇到了文件很大时&#xff0c;fs.readFileSync 会占据服务器大量的内存&#xff0c;即使读取的文件比较小…

代发考试战报:7月16号武汉参加HCIP-Transmission传输 H31-341考试通过

代发考试战报&#xff1a;7月16号武汉参加HCIP-Transmission传输 H31-341考试通过&#xff0c;&#xff0c;有2个题好像没见到过&#xff0c;其他都是题库里的原题&#xff0c;题库很准&#xff0c;这个题库也不是一直不变的&#xff0c;也没规律可循什么时候变题&#xff0c;哪…

【TAROT学习日记】韦特体系塔罗牌学习(6)——教皇 THE HIEROPHANT

韦特体系塔罗牌学习&#xff08;6&#xff09;——教皇 THE HIEROPHANT 目录 韦特体系塔罗牌学习&#xff08;6&#xff09;——教皇 THE HIEROPHANT牌面分析1. 基础信息2. 图片元素 正位牌意1. 关键词/句2.爱情婚姻3. 学业事业4. 人际财富5. 其他象征意 逆位牌意1. 关键词/句2…

PostgreSQL 中如何实现数据的批量插入和更新?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何实现数据的批量插入和更新&#xff1f;一、批量插入数据1. 使用 INSERT INTO 语句结…

PSINS工具箱函数介绍——r2d

介绍工具箱里面r2d这个小函数的作用。 程序源码 function deg r2d(rad) % Convert angle unit from radian to degree % % Prototype: deg r2d(rad) % Input: rad - angle in radian(s) % Output: deg - angle in degree(s) % % See also r2dm, r2dms, d2r, dm2r, dms2r% …

运维锅总详解VLAN

本文介绍了VLAN作用、公司多个部门VLAN举例、VLAN间路由、VLAN协议控制字段解释及工作流程、VLAN历史演进等方面对VLAN技术进行详细分析。希望对您理解VLAN有所帮助&#xff01; 一、VLAN作用 VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;…

FreeSWITCH 1.10.10 简单图形化界面26-在网页上播放SIP设备视频

​ FreeSWITCH 1.10.10 简单图形化界面26-在网页上播放SIP设备视频 1、前言2、大概流程3、测试环境4、安装流媒体服务器5、设置流媒体服务器接口6、简单写个web接口7、测试一下1、web播放在线播放器1在线播放器2本地video控件 2、vlc播放vlc播放rtmpvlc播放rtsp 8、总结 1、前…

简过网:公务员公示后是不是就没有问题了?

A&#xff1a;请问&#xff0c;公务员录用考试公示期过后是不是说明就正式录用了&#xff1f; Q&#xff1a;公务员已经公示录用&#xff0c;就说明前期政审已经过关&#xff0c;档案在前期的审查工作中没有发现问题&#xff0c;在入职前&#xff0c;档案会调入组织部&#xf…

10.发布确认

解决消息不丢失的一个重要环节。 前面说过消息持久化&#xff0c;可能出现一种情况就是&#xff1a; 尽管它告诉rabbitmq将消息保存到磁盘&#xff0c;但是依然存在当消息刚准备存储到磁盘的时候&#xff0c;但是还没有存储完&#xff0c;消息还在缓存的一个间隔点。此时消息…

充电桩--交流充电桩硬件原理以及竞品方案

聚焦光伏领域、深耕储能市场、探究充电技术 微信公众号 小Q下午茶 聚焦光伏领域&#xff0c;深耕储能市场&#xff0c;探究充电技术 47篇原创内容 公众号 一、交流充电桩系统介绍 为了实现能源安全和“双碳”目标的达成&#xff0c;充电桩是需要智能电网支持&#xff0c;…

Linux 各目录

Linux 是一个非常严谨的操作系统&#xff0c;每个目录都有自己的作用&#xff0c;这些作用是固定的&#xff0c;没有特殊情况&#xff0c;应严格执行&#xff1b; Linux 中所有东西以文件形式存储和管理&#xff0c;命令也不例外&#xff1b; 以下四个 bin 是二进制文件&…

linux C++ onnxruntime yolov8 视频检测Demo

linux C onnxruntime yolov8 视频检测Demo 目录 项目目录 效果 ​编辑CMakeLists.txt 代码 下载 项目目录 效果 ./yolov8_demo --help ./yolov8_demo -c2 -ptrue ./yolov8_demo -c1 -strue CMakeLists.txt # cmake needs this line cmake_minimum_required(VERSION 3…

力扣最热一百题——3.最长连续序列

目录 题目链接&#xff1a;128. 最长连续序列 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示 解法一&#xff1a;排序双指针剪枝 思路 1. 获取数组长度并进行特判 2. 对数组进行排序 3. 初始化变量 4. 遍历数组并寻找最长连续子序列 5. 返回结果 总结…

Linux笔记-对.a静态库的进一步理解(2024-04-09)

过程 问&#xff1a; Linux中生成.a库时候&#xff0c;如果代码里面调用了一些只引用未定义的函数&#xff0c;gcc不报错&#xff0c;但能生成对应的.a文件&#xff0c;这是为什么&#xff1f;再写一个执行程序去调用.a库时&#xff0c;链接时就会报这个.a库未定义的引用&…

列举excel中调整行高列宽的五种方法

列举excel中调整行高列宽的五种方法 在Excel中调整行高列宽的方法有以下五种&#xff1a; 使用鼠标手动调整行高列宽&#xff1a;将鼠标悬停在行或列的边界上&#xff0c;光标会变成双向箭头&#xff0c;此时按住鼠标左键并拖动边界即可调整行高或列宽。 使用快捷键调整行高列…

node和npm安装;electron、 electron-builder安装

1、node和npm安装 参考&#xff1a; https://blog.csdn.net/sw150811426/article/details/137147783 下载&#xff1a; https://nodejs.org/dist/v20.15.1/ 安装&#xff1a; 点击下载msi直接运行安装 安装完直接cmd打开可以&#xff0c;默认安装就已经添加了环境变量&…

vue3通过html2canvas dom转图片复制到剪贴板和dom转图片并下载

代码实现 <template><div class"page"><div id"to-img-dom"><strong>我是图片标题</strong><p>我是内容&#xff0c;我是内容&#xff0c;我是内容&#xff0c;我是内容&#xff0c;我是内容&#xff0c;我是内容&am…