C语言补习课——文件篇

news2024/9/20 21:41:45

来源:黑马程序员

第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=51byte
	printf("%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->97
	int 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.coloradmin.cn/o/2125132.html

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

相关文章

下班后做小红书第7个月,涨粉7w,累计变现5w+,我只用到五个点

下班后做小红书第7个月&#xff0c;涨粉7w&#xff0c;累计变现5w&#xff0c;经常有粉丝问我怎么做博主&#xff0c;甚至想找我付&#x1f4b0;Z询&#xff0c;因为有大家才有我的今天&#xff0c;所以干货直接分享给大家~ 我能快速涨粉的秘籍&#xff0c;其实就是“抄”&…

有关采用parallelStream并行流处理List并使用自定义线程池和lettuce redis客户端一起使用的问题

在使用parallelStream进行处理list时&#xff0c;如不指定线程池&#xff0c;默认的并行度采用cpu核数进行并行&#xff0c;这里采用ForJoinPool来指定线程池&#xff0c;但循环中使用了luttuce 来获取redis的key时&#xff0c;出现没有控制住线程池的线程数问题。具体上代码。…

第二证券:如何选出即将暴涨的股票?

选出行将暴升的股票是一个复杂且风险较高的进程&#xff0c;由于股市的波动受多种要素影响&#xff0c;包含但不限于公司业绩、商场心情、微观经济环境、方针变化等。以下是一些可能有助于选出潜在暴升股票的方法和建议&#xff1a; 1、出现严重利好消息 当股票出现严重利好消…

Nginx文件服务器搭建

1、安装依赖、关闭防火墙 [rootlocalhost ~]# yum install wget gcc gcc-c pcre pcre-devel openssl openssl-devel zlib zlib-devel [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# systemctl disable firewalld 2、创建nginx启动用户 注意&#xff1a;会在…

Windows与linux中docker的安装与使用

windos中安装使用docker 下载Docker_Desktop 安装包进入docker官网下载Docker_Desktop&#xff1a; https://www.docker.com/启用wsl 我们搜索“启用或关闭Windows功能”&#xff0c;打开后勾选适用于Linux的Windows 子系统 Docker_Desktop设置 出现Docker Engine stopp…

vue3 el-tabs 和 el-dropdown 结合实现 tagsView 标签导航

大致思路 所谓 tagsView 可以分成两部分来去看&#xff1a; tagsview 那怎么分开看呢&#xff1f; 首先我们先来看 tags&#xff1a; 所谓 tgas 指的是&#xff1a;位于 appmain 之上的标签 那么现在我们忽略掉 view&#xff0c;现在只有一个要求&#xff1a; 在 view 之…

开源 AI 智能名片 S2B2C 商城小程序相关角色的探索

摘要&#xff1a;本文围绕开源 AI 智能名片 S2B2C 商城小程序的决策产品方向&#xff0c;基于两个原则展开研究。原则一是根据该产品方向尽可能多地寻找相关角色&#xff0c;原则二是以探索痛点而非销售为核心。同时确保识别出的角色覆盖价值使用者、价值传递者与价值生产者三类…

揭秘团购奇迹:如何在一个月内实现超过600万的盈利

你是否曾经对那些看似亏损的商业机会感到好奇&#xff0c;却意外地发现它们在短短一个月内能为你带来超过六百万的收益&#xff1f;这个令人震惊的数字&#xff0c;是否激起了你的好奇心和探索欲&#xff1f;如果你愿意深入了解我们今天要分享的内容&#xff0c;我坚信你也能找…

零基础小白能学网络安全吗?

最近看到很多朋友都在问“零基础能学网络安全吗&#xff1f;” 今天整一篇帮大家分析一下&#xff0c;希望对你有帮助。 首先&#xff0c;问出这个问题的朋友&#xff0c;我大致判断一下&#xff0c;你对网络安全并不了解&#xff0c;只是单纯看到某个视频某篇文章&#xff0…

想从事FPGA需要学好哪些知识?

想从事FPGA需要学好&#xff1a; 1、数字电路基础 2、微机原理&#xff0c;汇编语言&#xff08;推荐王克义老师的《微机原理&#xff08;第2版&#xff09;》&#xff09;或计算机体系结构或单片机原理&#xff1b; 3、C/C&#xff0b;&#xff0b;语言&#xff1b; 4、Ve…

免费且实用:UI设计常用的颜色参考网站和一些Icon设计网站

用心去分享&#xff01;请给我点个关注和点赞收藏&#xff01;谢谢各位努力的人才&#xff01; 1.在UI设计的时候&#xff0c;没有灵感&#xff0c;怎么办&#xff1f;可以参考这个网站&#xff08;需要魔法能量&#xff09; 网址如下&#xff1a; Color Hunt - Color Palette…

windows中多ping网络ICMP

之前没搞过ICMP,第一次弄&#xff0c;遇到好多坑&#xff0c;其中在接收ICMP消息时无法指定ip这个坑困扰了好久&#xff0c;最后在网上找到一种解决方法&#xff1b;直接看效果吧&#xff01;&#xff01; 其中我获取ip状态直接扔到线程池里面处理的 struct DevicePingMsg {D…

OpenAI新模型“Strawberry“蓄势待发:会思考的AI即将登场?

OpenAI新模型"Strawberry"蓄势待发&#xff1a;会思考的AI即将登场&#xff1f; OpenAI的神秘大模型"草莓"&#xff08;Strawberry&#xff0c;之前称为Q*&#xff09;可能要提早亮相了。这款AI不仅能思考&#xff0c;还可能彻底改变我们与人工智能互动的方…

果蔬识别系统性能优化之路(三)

目录 前情提要遗留问题 解决方案优化查询速度优化ivf初始化的速度 下一步 前情提要 果蔬识别系统性能优化之路&#xff08;二&#xff09; 遗留问题 优化同步速度&#xff0c;目前大约30秒&#xff0c;不是一个生产速度 这次来解决遗留问题 通过console&#xff0c;发现两个…

【F178】基于Springboot+vue实现的智能无人仓库管理

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 互联网发展至今&#xff0c;无论是其理论还是技术都已经…

揭秘数据库性能飞跃的秘密:深入理解索引与执行计划的艺术

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

2024最新版超级全的Python基础知识

数据类型和变量 Python使用缩进来组织代码块,一般使用4个空格的缩进.使用#来注释一行,其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块.Python对大小写敏感 1.1整数 Python可以处理任意大小的整数,包括负整数,写法与数学上写法一致,例如&#xff1a;-100.如…

项目管理软件的技术深度剖析:从架构到创新的全面探索

各位技术小伙伴们&#xff0c;今天咱们跟随猴哥聊聊一个既熟悉又略带神秘的话题——项目管理软件。在快节奏的现代商业环境中&#xff0c;项目管理就像是企业运作的润滑剂&#xff0c;而项目管理软件&#xff0c;就是那把让一切井然有序的神器。不过&#xff0c;别看它平时默默…

大模型sft评估指标方案

大模型sft评估一直都是一个让人头疼的问题&#xff0c;那么如何进行sft评估呢&#xff1f; 一共有两类方案 第一类&#xff1a;用另一个AI或者人类 对模型答案进行打分 可以是竞技场模式&#xff0c;也可以是离线打分模式 打分可以用一些权威的榜单&#xff0c;例如 super…

AI芯片国产化率100%!运营商最大单集群智算中心投产

8月30日&#xff0c;中国移动建成运营商最大单集群智算中心——中国移动智算中心&#xff08;哈尔滨&#xff09;&#xff0c;并正式投产使用&#xff0c;将为全国的科技创新与产业升级带来强大助力。 该智算中心部署超1.8万张AI加速卡&#xff0c;AI芯片国产化率达100%&#x…