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…

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

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

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;可以教大家如何将手机铃声设置成自己喜欢的歌…

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系统…

Java | Leetcode Java题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; class Solution {public int integerReplacement(int n) {int ans 0;while (n ! 1) {if (n % 2 0) {ans;n / 2;} else if (n % 4 1) {ans 2;n / 2;} else {if (n 3) {ans 2;n 1;} else {ans 2;n n / 2 1;}}}return ans;} }

部署定时任务每2天清理一次表

1、创建存储过程 create or replace procedure truct authid current_user ---使用“authid Current_user”将存储过程转化为调用者权限 as begin execute immediate truncate table rep.tmp_s_st_busi_send_arc; end; / 2、创建定时任务 begin dbms_scheduler.create…

机器学习中的聚类艺术:探索数据的隐秘之美

一 什么是聚类 聚类是一种经典的无监督学习方法&#xff0c;无监督学习的目标是通过对无标记训练样本的学习&#xff0c;发掘和揭示数据集本身潜在的结构与规律&#xff0c;即不依赖于训练数据集的类标记信息。聚类则是试图将数据集的样本划分为若干个互不相交的类簇&#xff…

【人工智能学习笔记】4_3 深度学习基础之循环神经网络

循环神经网络(Recurrent Neural Network, RNN) 是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network),循环神经网络具有短期记忆能力 RNN核心思想 RNN的结构 一个典型…

【JS逆向学习】快乐学堂登陆接口(自定义DES加密、ddddocr验证码识别)

逆向目标 网址&#xff1a;https://www.91118.com/Passport/Account/Login接口&#xff1a;https://www.91118.com/passport/Account/LoginPost参数&#xff1a; passr 逆向过程 输入手机号、密码、验证码 点击登陆&#xff0c;多试几次&#xff0c;然后观察并比较不通请求…

鸿蒙界面开发——组件(7):组件导航 页面路由

组件导航 (Navigation)(推荐) Navigation() Navigation(pathInfos: NavPathStack)Navigation是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation组件适用于模块内和跨模块的路由切换&#xff0c…