复习C中文件操作

news2024/11/15 5:00:41

文章目录

  • Ⅰ. 重新谈论文件
  • Ⅱ. C语言中的文件接口
    • 1、打开文件
    • 2、关闭文件
    • 3、读写函数
    • 4、文件的随机读写
        • ① fseek函数(指定文件指针的位置)
        • ② ftell函数(求文件指针与起始位置的偏移量)
        • ③ rewind(让文件指针回到起始位置)
    • 5、文件读取结束的标志
  • Ⅲ. C语言文件接口的使用及细节

Ⅰ. 重新谈论文件

下面是对文件的一些共性认识:

​ 1、空文件 也要在磁盘中占据空间

​ 2、文件 = 内容 + 属性(Linux的文件内容和文件属性是分开存储的)

​ 3、文件操作 = 对内容操作 or 对属性操作 or 对内容和属性操作

​ 4、标定一个文件,必须通过:文件路径 + 文件名 (具有唯一性)

​ 5、如果没有指明文件路径,默认在当前路径下进行文件访问

​ 6、一个文件要 被访问之前必须先打开(文件被 用户进程操作系统 打开)

​ 7、文件操作的本质:进程被打开文件关系(未打开文件的属于文件系统,后面我们会讲)

Ⅱ. C语言中的文件接口

1、打开文件

FILE* fopen(const char* filename, const char* mode);
// filename为文件名,若不加路径的话且该文件不存在的话则会在当前目录下创建该文件
// mode为打开方式,一般有r、w、a等等
文件打开方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,新建一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb”(二进制只读)为了输入数据,打开一个二进制文件出错
“wb”(二进制只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(二进制追加)向一个二进制文件尾添加数据出错
“rb+”(二进制读写)为了读和写打开一个二进制文件出错
“wb+”(二进制读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(二进制读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件

2、关闭文件

int fclose(FILE* stream);
// stream是文件指针

3、读写函数

读取单个字符fgetc(FILE* stream)所有输入流
写入单个字符fputc(int character, FILE stream)*所有输出流
从文件中读取num个字符到strfgets(char str, int num, FILE stream)**所有输入流
写入一串字符到文件fputs(const char str, FILE stream)**所有输出流
将字符串转换为格式化数据fscanf(FILE stream, const char format, …)**所有输入流
将格式化数据转换为字符串fprintf(FILE stream, const char format, …)**所有输出流
二进制输入size_t fread(void ptr, size_t size, size_t count, FILE stream)**文件
二进制输出size_t fwrite(const void ptr, size_t size, size_t count, FILE stream)**文件

其中 freadrwrite 的参数解析如下:

  • ptr :从ptr指向的当前位置开始写入
  • size :每个元素的大小(以字节为单位)
  • count :要写入的元素个数
    • size 表示你要写入的基本单元是多大(以字节为单位),count 表示你要写入几个这样的基本单元。换言之,最终往文件中写的字节数是 = size * count,比如要写入 10 个字节,那么 size = 1 && count = 10、size = 2 && count = 5,不过一般建议把 size 写大点,count 写小点。
  • stream :指向输出流 FILE 对象的指针

4、文件的随机读写

① fseek函数(指定文件指针的位置)

int fseek(FILE* stream, long int offset, int origin);
// stream:指向标识流的 FILE 对象的指针
// offset:指针偏移量
// origin:指针起始点

​ 其中 origin 起始点有如下三种:

SEEK_SET文件开头
SEEK_CUR文件指针的当前所处的位置
SEEK_END文件结尾

② ftell函数(求文件指针与起始位置的偏移量)

long int ftell(FILE* stream);

③ rewind(让文件指针回到起始位置)

void rewind(FILE* stream);

5、文件读取结束的标志

  • 文本文件读取是否结束,fgetc判断返回值是否为 EOF, fgets判断返回值是否为 NULL
  • 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。 例如: fread判断返回值是否小于还是等于实际要读的个数。

feof:判断文件是否读到末尾而结束,返回值为真,就是读到了文件结束

ferror:判断文件是否读取错误而结束,返回值为真,就是文件读取遇到了错误

Ⅲ. C语言文件接口的使用及细节

  • “w” 的方式单纯打开文件,那么该文件的内容会被 清空
  • 当以 “w” 方式打开文件,它会建立一个新文件,它的 默认权限是0664(因为权限掩码umask为0666)
  • 在使用 fgets() 或者 fgetc() 时候,我们是按回车结束,而回车键也会被放到缓冲区内,所以我们如果要读取文件的时候并且不想带上 ‘\n’ ,那么我们就要将接收到的字符串置为0即 buffer[strlen(buffer) - 1] = ‘\0’
  • 下面的代码中 strlen(msg) + 1 -> 乱码,也就是把 ‘\0’ 也追加会造成,因为 ‘\0’ 是 C 的规定,和文件无关。这里 cat log.txt 并没有看到乱码的原因是 ‘\0’ 是不可见的,所以这里 vim log.txt 才可以看到乱码。
#include<stdio.h>
#include<string.h>
int main()
{
    FILE* fp = fopen("log.txt", "a");//以追加的打开当前目录下的log.txt文件,没有就新建,如果目标文件存在,a写时不会清空目标文件,在文件内容最后写入
    if(fp == NULL)
    {
        perror("fopen");
        return 1;
    }

    const char* msg = "Hello linux\n";
    // fwrite(msg, strlen(msg) + 1, 1, fp); // 乱码
    fwrite(msg, strlen(msg), 1, fp);                                                                               
    fclose(fp);
    return 0;
}

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

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

相关文章

pdf转为ppt的超简单方法,就用这几个!

在我们的工作和生活中&#xff0c;PDF文件是不可或缺的文件格式之一。它以高准确性、整齐的页面排版和流畅的翻页而闻名&#xff0c;为我们处理文档提供了很大的帮助。然而&#xff0c;PDF文件的一个缺点是无法进行修改。当我们不小心输入错误数据或需要进行编辑时&#xff0c;…

python 常用数据结构-集合

Set集合 Set 集合集合定义集合使用&#xff1a;创建集合使用&#xff1a;成员检测集合方法集合方法 add()集合方法 update()集合方法 remove()集合方法 discard()集合方法 pop()集合方法 clear() 集合运算集合运算&#xff1a;交集集合运算&#xff1a;并集集合运算&#xff1a…

JAVA结课作品——超市管理系统

项目描述&#xff1a;一个简单的超市管理系统&#xff0c;能够实现用户登入和注册功能&#xff0c;共分为前台和后台两个主要界面&#xff0c;普通用户界面操作权限收到限制&#xff0c;只能对商品和销售记录进行简单查询操作&#xff0c;后台中可以进行商品的删除、修改、查询…

Java 设计模式——单例模式

目录 1.结构2.实现2.1.饿汉式2.1.1.静态变量2.1.2.静态代码块2.1.3.枚举方式 2.2.懒汉式2.2.1.synchronized 线程安全2.2.2.双重检查锁2.2.3.静态内部类方式 3.破坏单例模式3.1.序列化反序列化3.2.反射 4.问题解决5.JDK 源码解析——Runtime 类 1.结构 &#xff08;1&#xff…

03-MySQL-基础篇-SQL之DDL语句

SQL之DDL语句 前言DDL数据库操作表操作查询操作数据类型案例修改删除 前言 *本篇来学习下SQL中的DDL语句 DDL 全称Data Definition Language&#xff0c;数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段) 数据库操作 查询所有数据库 s…

数字与字符的对决:力扣“将所有数字用字符替换”的独特方法

本篇博客会讲解力扣“1844. 将所有数字用字符替换”的解题思路&#xff0c;这是题目链接。 本题的解题思路是&#xff1a;遍历字符串&#xff0c;按照题目描述修改字符。 有一个需要注意的点&#xff1a;循环的结束条件是什么呢&#xff1f;是s[i] ! \0’吗&#xff1f;不是的…

多线程(2):线程同步

线程同步是在多线程编程过程中对数据保护的一种机制&#xff0c;保护的数据是共享数据。共享数据就是多个线程共同访问的一块资源&#xff0c;也就是一块内存。假设有3个线程&#xff0c;其中A,B线程在同一个时间点往这块内存中写数据&#xff0c;于此同时C线程往这块内存中读数…

视频编码流程 YUV数据编码为H264数据

文章目录 1.视频编码流程2.实战demo3.相关编码知识点讲解1. 参数设置问题:2. 关于av_opt_set3. 关于码流设置 1.视频编码流程 2.实战demo #ifndef MAINBACK_C #define MAINBACK_C #endif // MAINBACK_C #include <stdint.h> #include <stdio.h> #include <stdl…

火车头采集器AI伪原创[php源码]

本文介绍php版本的火车头采集器AI伪原创&#xff0c;对于网站的原创内容&#xff0c;站长朋友们一定很头疼。作为一个草根站长&#xff0c;自己写原创文章太累了。当然&#xff0c;我并不是说你不能写。自己写原创文章是不现实的。时间是最大的问题。 也许有的站长朋友会问&…

自定义封装Mybatis的过程

手写持久层框架思路分析&#xff1a; 步骤1:加载数据库配置信息&#xff0c;包括数据库url&#xff0c;端口&#xff0c;数据库名字&#xff1b;加载所有sqlmapper文件。 步骤2: 创建javaBean&#xff0c;全局配置类&#xff0c;Configuration&#xff0c;映射配置类&#xff…

香橙派和树莓派基于官方外设开发

香橙派和树莓派基于官方外设开发 1.wiringPi外设SDK安装 方式一&#xff1a; git clone https://github.com/orangepi-xunlong/wiringOP //下载源码 cd wiringOP //进入文件夹 sudo ./build clean //清除编译信息 sudo ./build //编译方式二 通过windows浏览器打开https://…

全网最新网络安全学习路线

在各大平台搜的网安学习路线都太粗略了。。。。看不下去了&#xff01; 我把自己整理的系统学习路线&#xff0c;拿出来跟大家分享了&#xff01;点击查看详细路线图 建议的学习顺序&#xff1a; 一、网络安全学习普法&#xff08;心里有个数&#xff0c;要进去坐几年&#xf…

Java入门教程||Java 网络编程||Java 发送邮件

Java 网络编程 网络编程是指编写运行在多个设备&#xff08;计算机&#xff09;的程序&#xff0c;这些设备都通过网络连接起来。 java.net包中J2SE的API包含有类和接口&#xff0c;它们提供低层次的通信细节。你可以直接使用这些类和接口&#xff0c;来专注于解决问题&#…

基于simulink视频处理系统多核仿真(附源码)

一、前言 此示例演示如何使用 Simulink中的数据流执行域在多个内核上运行视频处理系统。 数据流执行域允许您在计算密集型系统的设计中使用多个内核。此示例演示数据流作为子系统的执行域如何提高模型的模拟性能。 二、视频中的对象计数 此示例演示如何使用基本形态运算符从…

Docker部署Doris超详细图文教程

Doris安装有非常多的方法&#xff0c;这里主要介绍Docker中使用dev容器用来学习和测试的方法&#xff0c;避免在其他教程中踩坑(生产环境不建议使用Docker安装) 这里介绍一个不踩坑的docker本地单机版&#xff0c;笔者安装环境为Windows下的Docker&#xff0c;若为Linux系统安装…

SwiftUI + Swift 设备振动

如何让设备振动呢 iPhone 6S 3D Touch&#xff0c;可以识别轻&#xff0c;中&#xff0c;重三种按压力度&#xff0c;配合恰到好处的振动有利于提升交互体验&#xff0c;但后面的新设备都不支持 3D Touch 了&#xff0c;改为了检测按压时间&#xff0c;按同一个图标&#xff0…

如何用canvans实现地图上的运动轨迹

1.先需要一个地图的图片 2.通过canvas绘制出运动轨迹 // 创建渐变function createGradient(context, p0, p1) {const gradient context.createLinearGradient(p0.x, p0.y, p1.x, p1.y);gradient.addColorStop(0, "rgba(255, 0, 255, 0)");gradient.addColorStop(1,…

颜色渐变的数据密集适用的堆叠图

一般情况会用柱状图去堆叠&#xff0c;但是如果数据量太大了&#xff0c;就可考虑这种方式堆叠。可以呈现时间和数量上不同层次数据的变化。 效果图&#xff1a; 比较详细的注释一下源码&#xff1a; import matplotlib as mpl import matplotlib.pyplot as plt import numpy …

第七章:L2JMobius学习 – 登录服务LoginServer讲解

在上一个章节中&#xff0c;我们学习了网络数据传输的封装network。那么&#xff0c;在本章的登录服务LoginServer的讲解中&#xff0c;我们就来使用一下这个封装好的功能。Network的封装需要我们继承很多的接口或类。我们首先查看一下登录服务LoginServer的文件结构&#xff0…

[Android 13]Binder系列--获取ServiceManager

获取ServiceManager hongxi.zhu 2023-7-1 以SurfaceFlinger为例&#xff0c;分析客户端进程如何获取ServiceManager代理服务对象 主要流程 SurfaceFlinger中获取SM服务 frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp // publish surface flingersp<…