C语言补习课——文件篇

来源:黑马程序员

第157讲 C语言操作文件概述

读取文件:输入流

写文件:输出流

读写的方向判断取决与参照,一般我们站在程序的角度判断读写方向。

第158讲 路径

基本概念

路径就是指文件在电脑中的位置,eg:C:\Users\Administrator\Desktop

表示方式

①绝对路径

例如:C:\Users\Administrator\Desktop

绝对路径以盘符作为起始标志,除非认为改动位置是固定所以叫绝对路径。

②相对路径

例如:aaa\a.txt

相对于当前项目而言的位置。

第159讲 转义字符

C语言中路径以字符串形式存在。 

\在C语言中代表一个转义字符(改变后面这个符号原本的含义);"代表字符串的开头或者结尾。

所以在代码中如果想要打印\和“,需要先在前面加上转义字符。

正确打印当前文件位置的代码:

#include <stdio.h>int main()
{char* path = "E:\\0_C&C++ Projects\\C\\FilePath\\files\\file demo.txt";printf("%s\n", path);return 0;
}

注意点

文件路径的末尾必定是一个带有文件格式标识的文件名称(例如:a.txt)!

第160讲 利用fgetc一次读一个字节

文件操作流程

①打开文件           fopen

②读数据               fgetc (file get char,一次读一个字节)  fgets(file get string,一次读一行) 

                             fread(跨行处理)

③关闭文件           fclose

函数介绍

fopen

函数原型:

FILE *fopen(const char *path, const char *mode);

形参介绍:

path 参数指定了要打开文件的路径和名称。

mode 参数指定了文件的打开模式(如只读、只写、追加等)。

mode 参数的一些常用值包括:

一般视频、音频、图片的文件格式是二进制类型,本节课操作文本文件。

作用拓展:

使用 fopen 打开文件后,可以通过一系列的输入/输出函数(如 freadfwritefprintf、fscanffgetsfputs 等)对文件进行读写操作。完成文件操作后,应使用 fclose 函数关闭文件,以释放与 FILE 对象相关联的资源。

冷知识

部分C++编译器中里面char *path="hello"会报错“const char*类型不能用来初始化char*类型”,解决方法也是队中多样的。

fgetc

函数原型:

int __cdecl fgetc(_Inout_ FILE* _Stream);

形参介绍:Stream 是指向 FILE 对象的指针,该对象标识了要从中读取字符的文件流。

返回值:读取成功则返回读取到的字符,读不到就返回-1。

fclose

函数原型:

int fclose(FILE* _Stream);

形参介绍:Stream:指向 FILE 对象的指针,该对象标识了要关闭的文件流。这个 FILE 指针是通过之前对 fopenfreopen 或 fdopen 的调用获得的。

返回值:如果文件成功关闭,fclose 函数返回 0

如果关闭文件时发生错误,返回 EOFEOF 是一个在 <stdio.h> 中定义的宏,通常用于表示文件结束或错误条件。

操作实例

①在工程文件内新建一个文本文件,随意写入一行字符。

②修改编码格式为ANSI,步骤如下:

(1)点击文件->另存为;

(2)点击编码,选择为ASNI(少了这一步会输出中文乱码)。

③开始编程

#include <stdio.h>
#include <stdlib.h>int main()
{char* path = "E:\\0_C&C++ Projects\\C\\Fgetc\\files\\file demo.txt";FILE* file = fopen(path, "r");/*调试if (file == NULL) {perror("Error opening file");return EXIT_FAILURE;  }int c = fgetc(file);if (c != EOF) {printf("%c\n", c);}else {printf("No characters read or file is empty.\n");}fclose(file);return EXIT_SUCCESS; *//*待改进int c = fgetc(file);printf("%c", c);c = fgetc(file);printf("%c", c);c = fgetc(file);printf("%c", c);c = fgetc(file);printf("%d", c);fclose(file);*/int c;while ((c=fgetc(file))!=-1){printf("%c", c);}fclose(file);return 0;
}

输出结果:

第161讲 利用fgets一次读一行数据

fgets函数介绍

函数原型:

char *fgets(char *str, int n, FILE *stream);

形参介绍:

str:指向用于存储读取到的字符串的字符数组。

n:指定要读取的最大字符数(包括最后的空字符\0)。如果读取的字符数(不包括最后的空字符)达到了n-1,函数将停止读取,并在字符串末尾添加一个空字符\0

stream:指向 FILE 对象的指针,该对象标识了要从中读取数据的输入流。

返回值:

如果成功读取到字符串,fgets 函数返回 str 的地址。

如果读取失败(例如,遇到文件结束符或发生错误),则返回 NULL

如果在读取任何字符之前已经到达文件末尾,则 str 的内容保持不变,并返回一个空指针。

使用示例

#include <stdio.h>int main()
{char* path = "E:\\0_C&C++ Projects\\C\\Fgets\\poetry\\静夜思.txt";FILE* file = fopen(path, "r");char buffer[1024] = "";char* str;while ((str= fgets(buffer, 1024, file))!=NULL) {printf("%s\n", str);}fclose(file);return 0;
}

输出结果:

注意事项

①fgets每次读取一行数据,以换行符(按下回车键或者叫"\n")为准。

②如果读不到了就会返回NULL。

第162讲 利用fread一次读多个字节

fread函数介绍

函数原型:

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

形参介绍:

void *ptr:指向用于存储读取数据的缓冲区的指针。

size_t size:每个数据项的大小(以字节为单位)。

size_t nmemb:要读取的数据项的最大数量。

FILE *stream:指向 FILE 对象的指针,该对象标识了要从中读取数据的输入流。

返回值:

成功时,fread 返回实际读取的元素数量,这可能会小于请求的数量 nmemb,尤其是在遇到文件结束(EOF)或发生错误时。

如果发生错误或到达文件末尾前没有读取任何数据,则返回 0。

代码示例

#include <stdio.h>int main()
{char* path = "E:\\0_C&C++ Projects\\C\\Fread\\poetry\\静夜思.txt";FILE* file = fopen(path,"r");char buff[1024];int num = fread(buff, 1, 1024, file);   //获取文件中的元素数量,24个汉字字符(包括标点)*2byte+3个换行符*1byte=51byteprintf("%d\n", num);printf("%s",buff);fclose(file);return 0;
}

输出结果

注意细节

①Windows64位系统中英文字母占用1个字节,中文字符占用2个字节。

②fread在读取时每次尽可能会把数组装满,返回当前读取到的有效字节数

假设文件为100个字节,数组长度为30;那么接下来读取的流程为:
第一次,读取前面30个字节,把数组给装满,函数返回30;
第二次,读取后面30个字节,把数组给装满,函数返回30;
第三次,读取后面30个字节,把数组给装满,函数返回30;
第四次,读取剩余的10个字节,会把数据放在数组当中,函数返回10;
第五次:没有数据可以被读取了,函数返回0。

所以可以利用这个特性改进代码:

	char* path = "E:\\0_C&C++ Projects\\C\\Fread\\poetry\\静夜思.txt";FILE* file = fopen(path,"r");char buff[100];int num ;   while ((num = fread(buff, 1, 100, file)) != 0){for (int i = 0; i <num ; i++) {printf("%c",buff[i]);     //注意%c后不能有其他东西}}fclose(file);return 0;

while循环内判断是否到达到达文件末尾,for循环遍历字符数组打印。

输出结果:

第163讲 三种写出数据的方式

基本概念

写出数据就是把程序中的数据,写到本地文件中永久存储。

书写步骤

1 打开文件                   fopen

2 写数据                      fputc fputs fwrite

3 关闭通道                    fclose

文件读写模式



 fputc

函数原型:

int fputc(int  _Character, FILE* _Stream);

形参介绍:_Character是想要写入的字符的ASCII值,_Stream是指向目标文件的指针。

返回值:如果写入成功,函数返回写入的字符的ASCII码值;如果写入失败(例如,由于磁盘空间不足或文件是只读的),则返回EOF(在stdio.h中定义的宏,通常表示-1)。

fputs

函数原型:

int fputs(const char* _Buffer,FILE* _Stream);

形参介绍:_Buffer是指向要写入文件的字符串的指针;_Stream是指向 FILE 对象的指针,该对象标识了要写入的文件流。

返回值:写出成功返回非负数,建议忽略

fwrite

函数原型:

fwrite( void const* _Buffer, size_t _ElementSize, size_t _ElementCount,FILE* _Stream);

形参介绍:

_Buffer:这是一个指向数据的指针,这些数据将被写入到文件中。注意,由于这是一个 void 类型的指针,所以它可以指向任何类型的数据。但是,你需要确保传递给 _ElementSize 的值正确反映了每个数据元素的大小。

_ElementSize:这是每个数据元素的大小(以字节为单位)。它告诉 fwrite 每个数据项占用的字节数。

_ElementCount:这是要写入文件的数据元素的数量。fwrite 会尝试写入指定数量的数据元素到文件中。

_Stream:这是一个指向 FILE 对象的指针,该对象标识了要写入数据的文件流。

返回值:fwrite 函数返回成功写入的数据元素的数量。注意,这个数量可能小于我们请求的 _ElementCount,特别是当文件系统的空间不足或发生其他错误时。如果发生错误,我们可以检查 ferror 函数的返回值来确定是否发生了错误。

代码示例

#include <stdio.h>int main()
{char* path = "E:\\0_C&C++ Projects\\C\\FileWrite\\Myfiles\\myfile.txt";FILE* file=fopen(path, "w");//ASCII值a->97int c=fputc(97,file);printf("%c\n", c);char* str = "\n银瓶乍破水浆迸";int n=fputs(str,file);printf("%d\n", n);char message[20] = "\n铁骑突出刀枪鸣";int num=fwrite(message,1,17,file);printf("%d\n", num);fclose(file);return 0;
}

输出结果:

文件里面的现状:

第164讲 多种读写模式

fopen的小细节

fopen(path,"w");如果要写出的文件不存在,编译器可以创建文件,但必须保证前面的文件夹是存在着的。如果文件已经存在,会把原文件清空。

fopen(path,"a");a=append追加写出

fopen的一些其他模式

第165讲 拷贝文件

纯文本文件在打开数据源时可以使用r、w、a模式,通俗地讲windows系统中的记事本可以打开地文件就叫做纯文本文件,例如存储文字地txt、md文件、歌词文件lrc文件等。

代码示例

#include <stdio.h>int main()
{//打开数据源char* path = "D:\\readme.txt";FILE* fScource = fopen(path,"r");//复制文件路径char* newpath = "E:\\0_C&C++ Projects\\C\\FileCopy\\Container\\copy.txt";FILE* fCopy = fopen(newpath, "w");//利用循环读取数据char arr[1024];int n;while ((n=fread(arr,1,1024, fScource))!=0){fwrite(arr,1,n, fCopy);}fclose(fScource);fclose(fCopy);return 0;
}

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

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

相关文章

阿里旗下土耳其电商Trendyol计划进军欧洲市场

阿里旗下土耳其电商Trendyol计划进军欧洲市场 近年来&#xff0c;阿里巴巴集团在全球电商领域的布局持续深化&#xff0c;其旗下土耳其电商巨头Trendyol更是凭借其出色的市场表现和强劲的增长势头&#xff0c;成为了备受瞩目的焦点。近日&#xff0c;Trendyol宣布了一项重要战…

Java初步

背景 名字 Oak&#xff08;橡树&#xff09;改到一个岛&#xff08;疑似盛产咖啡&#xff09; Java之父 詹姆斯高斯林&#xff08;James Gosling&#xff09; sun公司研发 现在属于Oracle公司 把它称为甲骨文公司 应用 企业级应用开发 重点学习JavaSE&#xff08;Standa…

Spring Boot集成Mockito快速入门Demo

1.什么是Mockito&#xff1f; Mockito是一个模拟测试框架&#xff0c;可以让你用优雅&#xff0c;简洁的接口写出漂亮的单元测试。Mockito可以让单元测试易于可读&#xff0c;产生简洁的校验错误。 使用场景 提前创建测试&#xff0c;TDD&#xff08;测试驱动开发&#xff0…

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相…

C#中的字段和属性

字段和属性 字段和属性的基础介绍 类拥有成员变量和成员方法 成员变量就是字段&#xff0c;用于存储对象的信息 public string name; //公共字段private int age; //私有字段可以给成员变量设置其内部的get/set方法&#xff0c;操作获取或设置成员时的操作。 internal cla…

JavaScript高级——函数中的this

1、this是什么&#xff1f; ① 任何函数本质上都是通过某个对象来调用的&#xff0c;如果没有直接指定就是 window 。 ② 所有函数内部都有一个变量 this 。 ③ 它的值是调用函数的当前对象。 2、如何确定 this 的值&#xff1f; ① test&#xff08;&#xff09;&#xff…

如何进行DAP-seq的数据挖掘,筛选验证位点

从样本准备到寄送公司&#xff0c;每一天都在“祈祷”有个心仪的分析结果&#xff0c;终于在这天随着邮件提示音的响起&#xff0c;收到了分析结果...... 分析前工作 爱基在进行数据分析之前&#xff0c;会有两次质控报告反馈给老师们。第一个&#xff0c;基因组DNA的提取质控…

springBoot 集成https

springBoot 集成https 1、springBoot默认的证书格式 pring Boot 需要 .p12 或 .jks 格式的证书。如果你只有 .pem 和 .key 文件&#xff0c;可以使用 openssl 工具将它们转换成 .p12 文件 2、转换.p12 我的证书文件如下&#xff0c;需要转换 2.1 下载openssl https://slpr…

苹果手机铃声怎么设置自己的歌?3个方法自定义手机铃声

苹果手机内部的手机铃声库只有固定的几首铃声&#xff0c;且都是纯音乐&#xff0c;比较单调&#xff0c;并不是所有用户都喜欢这些铃声。那么&#xff0c;苹果手机铃声怎么设置自己的歌呢&#xff1f;小编这里有3个方法&#xff0c;可以教大家如何将手机铃声设置成自己喜欢的歌…

MongoDB 的适用场景

MongoDB 的适用场景 MongoDB 是一种基于文档存储的 NoSQL 数据库&#xff0c;与传统的关系型数据库不同&#xff0c;它使用 JSON 类似的二进制文档格式&#xff08;BSON&#xff09;来存储数据&#xff0c;并且具备灵活的文档模型、强大的查询能力和水平扩展性。这些特性使得 …

Java 入门指南:Java 并发编程 —— 同步工具类 Semephore(信号量)

文章目录 同步工具类Semephore核心功能限制并发访问量公平与非公平策略灵活性与适应性 常用方法使用示例 同步工具类 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 提供的用于并发编程的工具类库&#xff0c;其中包含了一些通信工具类&#xff0c;用于在多个线程之…

C语言-综合案例:通讯录

传送门&#xff1a;C语言-第九章-加餐&#xff1a;文件位置指示器与二进制读写 目录 第一节&#xff1a;思路整理 第二节&#xff1a;代码编写 2-1.通讯录初始化 2-2.功能选择 2-3.增加 和 扩容 2-4.查看 2-5.查找 2-6.删除 2-7.修改 2-8.退出 第三节&#xff1a;测试 下期…

【单片机开发】单片机常用开发工具

【前言】 在嵌入式系统领域&#xff0c;单片机&#xff08;Microcontroller, MCU&#xff09;作为核心组件&#xff0c;广泛应用于智能家居、工业控制、汽车电子等众多领域。而单片机开发工具&#xff0c;则是开发者们实现创意、解决问题的重要助手。本文主要讲述目前主流的单…

港科夜闻 | 叶玉如校长出席2024科技+新质生产力高峰论坛发表专题演讲,贡献国家科技强国战略...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、叶玉如校长出席“2024科技新质生产力高峰论坛”&#xff0c;做了题为“三个创新&#xff1a;培育和发展新质生产力、贡献国家科技强国战略”的主题演讲。该论坛于9月2日在香港召开。论坛围绕夯实基础科研、推动源头创新、…

axure判断

在auxre中我们也可以实现判断的功能&#xff0c;当目标等于什么内容时则执行下方的功能。 一、判断输入框中是否有值 画布添加一个输入框、一个文本标签删除其中内容&#xff0c;添加一个按钮&#xff0c;输入框命名为【文本显示】文本标签命名为【提示】 给按钮新增一个交互…

单向链表概述

文章目录 &#x1f34a;自我介绍&#x1f34a;单向链表概述数据域和指针域数据类型设计 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也要…

(计算机网络)应用层

1.为什么需要应用层 应用层提供使用tcp&#xff0c;udp使用的方式 协议就是制定的规则 2.域名服务器概述 域名是唯一的 新增域名&#xff0c;大家都要修改这个文本文件&#xff0c;所以要进行集中管理这个文本文件&#xff0c;而不是使用本地的hosts文件 hosts文件在Windows系统…

python 图片识别文字

要在 Python 中实现图片中的文字识别&#xff0c;通常使用的是 Tesseract OCR&#xff0c;结合 Pillow 处理图像。以下是一个简易的实现步骤&#xff1a; 1. 安装所需库&#xff1a; 你需要安装以下库&#xff1a; Tesseract OCR 引擎&#xff1a;这是进行文字识别的核心工具…

循环语句(C语言)

一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一条语句先执行&#xff0c;接着是第二条语句&#xff0c;依此类推。循环语句允许我们多次执行一个语句或语句组。 “ while ”循环 功能描述&#xff1a;当给定条件为真时&#xff0c;重复语句或语句组。它会…

内核线程同步之信号量、互斥量、自旋锁、原子量

本次主要是学习线程同步时保护数据的锁机制,对于多个线程同时对一个变量进行赋值操作时,会造成该变量的赋值不确定,出现了竞争状态,这时需要有个锁来保护下,即加个锁,同一时间只能有一个线程对其操作,当锁释放了,另一线程才能对其操作,而处在加锁和解锁之间的区域叫做…