C语言【文件】

news2024/11/16 21:23:32

目录

 概念

 文件名

 文件的打开和关闭

fopen

fclose 

输入输出函数 

 fputc

fgetc

fputs

fgets 

fprintf

fscanf

fwrite

fread

三种流

scanf和sprintf

 结构体转化

​编辑

 文件的随机读写

fseek

ftell

rewind

文本文件和二进制文件

文件读取结束的判定

文件缓冲区


 概念

文件的作用:文件是存放于硬盘中的,使数据能够持久化保存。

数据文件文件的内容不一定是程序,它可以是程序运行时产生的读写数据。

有时后我们会将文件输出到磁盘上,在需要的时候再从磁盘上把数据读取到内存中使用。

 文件名

一个文件需要一个唯一的文件标识:
文件路径 + 文件名主干 + 文件后缀

例: c:\code\test.txt

 文件的打开和关闭
 

为了方便访问文件中的数据,每个被使用的文件都在内存中开辟了一个相应的文件信息区,记录文件名文件的状态、文件路径等)。这个文件信息区被存放在一个结构体变量中,通过文件指针可以访问这块区域,并对文件实施各种操作。

FILE* pf;//文件指针变量

 

fopen

根据文件名打开打开文件,并返回一个FILE*类型的指针。

文件操作模式类型(第二个参数): 

注意文件路径可以是相对或绝对路径
 

fclose 

关闭文件,和fopen一起使用。 

输入输出函数 

 fputc

意为将字符写入到文件中。

返回值: 为字符的ASCII码值(非负值)。失败返回-1。

 利用返回值写入的数据依次打印到屏幕上:

int main()
{
	//打开文件
	FILE* pf = fopen("text.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		putchar(fputc('a'+i, pf));
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

fgetc

意为获取文件中的字符返回它的ascii码在使用fgetc前,要确保文件状态为 r 专注输入数据而非w专注输出数据,否则会导致读取失败。

 pf指针具有Placeholder指针可以遍历文件:

 

int main()
{
	//打开文件
	FILE* pf = fopen("text.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
int ch = 0;
	while ((ch = fgetc(pf)) != EOF)//意为读取文件所有内容之后返回-1(文件末尾)
	{
		printf("%c", ch);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

fputs

作用:将字符串写入到文件中,想达到按行写入可以主动加上\n

返回值:成功时返回非负值,失败返回-1。

 

fgets 

作用:从文件中依次读取字符串,遇到\n或者读取(num-1)个数字后终止读取。也就是说它只读取num-1个数字并在num或\n后处自动补上\0

返回值:str的首地址,若失败返回NULL。

  

fprintf

 从文件流中按照一定格式写数据。

 例如复杂的结构体

struct S
{
	char name[20];
	int age;
	float score;
};


fscanf

 从文件流中按照一定格式读数据。

 

当然,你也可以用前面的文件读取函数进行读取:

char arr[20] = { 0 };
fgets(arr,20,pf);//也行
printf("%s",arr);

fwrite

对文件进行二进制写入。[适用于所有类型]

第一个参数为写入数据的地址,第二个参数为数据的大小,第三个参数为数据个数。类似于memcpy一个字节一个字节拷贝数据。

 注意读写二进制文件属性要变为 ”wb"

 

这下知道文件中为什么会有乱码了吧~ 

fread

对文件进行二进制读取,会返回读取成功的count个数。

 

三种流

而文件输入输出函数适用于所有流它们对数据的操作可以不局限于文件。也就是说可以用它们实现像scanf、printf之类函数的功能:

fprintf(stdout, "hello world");//屏幕
int a = 0;
fscanf(stdin,"%d" ,a);//键盘

scanf和sprintf

sscanf按照一定格式将字符串转换为特定格式

sprintf将其他数据类型按照指定的格式转换成字符串。【后面自动补‘\0’】

 结构体转化

将结构体转化成字符串:

 将字符串转化成结构体:

 文件的随机读写

fseek

作用:将流里文件指针设置起始位置偏移量,按此偏移量的位置进行读写操作。

 

SEEK_END为末尾数据的下一个位置 

	int ch = fgetc(pf);
	putchar(ch);
//a
	fseek(pf,-2,SEEK_END);//反向找
	ch = fgetc(pf);
	putchar(ch);
//e
	fseek(pf, 0, SEEK_SET);//回到起始位置
	ch = fgetc(pf);
	putchar(ch);
//a
	//查找完a后指针位置会向后增1
	fseek(pf, 3, SEEK_CUR);//b-->cde
	ch = fgetc(pf);
	putchar(ch);
//e

ftell

返回当前文件指针所指向的位置(偏移量)。

rewind

 将文件指针设置成最开始的位置。

文本文件和二进制文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是 二进制文件 。(乱码)
字符一律以 ASCII 形式存储,数值型数据既可以用 ASCII 形式存储,也可以使用二进制形式存储。

对于整数10000,以ASCII码存储为5个字节,而二进制存储只占4和字节。

文件读取结束的判定

牢记:在文件读取过程中,不能用 feof 函数的返回值直接用来判断文件的是否结束。
而是 应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
  • fgetc 判断是否为 EOF .
  • fgets 判断返回值是否为 NULL .
  • fread判断返回值是否小于实际要读的个数。

fgetc: 

int main(void)
{
    int c; // 注意:int,非char,要求处理EOF
    FILE* fp = fopen("test.txt", "r");
    if(!fp) {
        perror("File opening failed");
        return EXIT_FAILURE;
   }
 //fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
    while ((c = fgetc(fp)) != EOF) 
   { 
       putchar(c);
   }

    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
        puts("End of file reached successfully");
    fclose(fp);
}

 二进制:

#include <stdio.h>
enum { SIZE = 5 };
int main(void)
{
    double a[SIZE] = {1.,2.,3.,4.,5.};
    FILE *fp = fopen("test.bin", "wb"); // 必须用二进制模式
    fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组
    fclose(fp);
    double b[SIZE];
    fp = fopen("test.bin","rb");
    size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组
    if(ret_code == SIZE) {
        puts("Array read successfully, contents: ");
        for(int n = 0; n < SIZE; ++n) printf("%f ", b[n]);
        putchar('\n');
   } else {
       if (feof(fp))
          printf("Error reading test.bin: unexpected end of file\n");
       else if (ferror(fp)) {
           perror("Error reading test.bin");
       }
   }
    fclose(fp);
}

文件缓冲区

所谓文件缓冲区,就是在使用文件时,系统会为每个文件分配一块缓冲区用于存放数据,当内存向磁盘中传输数据或当磁盘向内存中传输数据的时候,这些数据会一个一个被加载到缓存区上,再一齐被加载到内存或磁盘上。

 

作用:将缓存区中的数据输出到流里(stdout、FILE) 

#include <windows.h>
#include <stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	int a = 10000;
	fwrite(&a, sizeof(int), 1, pf);//二进制
	printf("内容存放在缓冲区,此时打开文件无内容\n");
	Sleep(10000);//休眠10秒,数据已经在缓存区上了
	fflush(pf);//刷新缓冲区
	printf("再打开文件,内容已存在\n");
	fclose(pf);//注:fclose在关闭文件的时候,也会刷新缓冲区
	pf = NULL;
}

注:读取写入数据时遇到\n或fclose也会刷新缓冲区。 

所以在我们对文件进行操作时别忘了执行刷新缓冲区文件关闭操作!否则可能造成文件读写出错。

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

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

相关文章

【试题035】逻辑非!例题

1.题目&#xff1a;下列表达式值为1的是&#xff1f; A. 3 & 4 B. 2 >5 C. ! !8 D. 0 &#xff01; 0 2.分析&#xff1a; 关于A选项&#xff1a; 3的二进制是&#xff1a;0011 4的二进制是&#xff1a;0100 0011 & 0100 00000 关于B选项&#xff1a; …

双势阱模型

双势阱模型 原子钟 传统的原子钟利用氨分子 由于隧道效应&#xff0c;上顶点的氮原子可以贯穿三个氢原子形成的势垒&#xff0c;到达下顶点对体系注入微波能量后&#xff0c;氮原子在上下定点之间振荡&#xff0c;体系的能量在两个稳定态之间交替变换&#xff0c;其振荡频率决…

2023淘宝十一预售今天20点开启!有什么优惠活动我们来一起看一下!

2023双11预售玩法将于今天20点正式开启&#xff01;有神优惠活动和玩法攻略&#xff0c;我&#xff0c;们一起来看一下&#xff01; 今双十一预售有加购赢清空购物车大奖&#xff0c;攒幸运值领红包&#xff0c;限时抢免定金福利&#xff0c;做任务攒幸运值赢免定特权这几大活…

PS001:PS2020及GeographicImager6.2安装

引言&#xff1a;Geographic ImagerV6.2是一款专业的PS地理成像插件&#xff0c;通过安装这款插件可实现在PS中加载4G以上的.bigtiff格式影像并对其进行修改与保存。并且这款软件拥有投影信息修改、基于地理坐标进行影像裁切等多种功能。 一、插件介绍 Geographic ImagerV6.2是…

【Windows】Edge浏览器自动更新服务启用选禁用被拒绝访问的解决方案

Windows系统的服务窗口里&#xff0c;把一些服务的启动类型选择禁用有可能会提示拒绝访问&#xff0c;怎么弄呢&#xff0c;这里讲一讲怎样禁用这个服务。 举一个类似禁用服务的例子&#xff1a;怎样关闭Edge浏览器的自动更新服务&#xff0c; 关闭服务 已知&#xff0c;Win…

CesiumJS 中绘制大多边形

本文翻译自Cesium官方&#xff0c;有改动。 本文中提及到的“大多边形”就如下图所示。 在Cesium的早期版本和一些引擎中&#xff0c;我们绘制这种跨度比较大的多边形&#xff0c;经常会看到一些奇怪的冲突问题&#xff0c;如下图所示。 要渲染任何几何体&#xff0c;我们必…

makesense在线yolov5标注

文章目录 一、创建图片文件夹和label.txt二、在线标注数据 参考文章博主&#xff1a;风吹落叶花飘荡 一、创建图片文件夹和label.txt 创建一个放置图片的文件夹images&#xff0c;存放需要标注的图片&#xff08;图片最好重命名为1,2,3…避免后面混淆&#xff09; 创建label.t…

BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain

BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain----《BadNets:识别机器学习模型供应链中的漏洞》 背景&#xff1a; 许多用户将训练过程外包给云计算&#xff0c;或者依赖于经过训练的模型&#xff0c;然后根据特定的任务对模型进行微调。这…

patient feature-based softmax embedding

方法 作者未提供可直接运行的代码

JAVA基础(JAVA SE)学习笔记(七)面向对象编程(进阶)

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段&#xff1a;Java面向对象编程 6.面向对象编程&#xff08;基础&#xff09; 7.面向对象编程&…

Autosar代码阅读和调试方法

一、前言 众所周知Autosar工程代码量非常庞大&#xff0c;而且有非常多的宏定义&#xff0c;代码可读性非常不友好。但是目前国内外很多OEM和Tire1都是基于Autosar系统进行项目开发的。在开发过程中&#xff0c;出现一些BUG时必须去阅读和调试代码。这就要求开发人员具备很强代…

JavaScript基础知识16——分支语句

哈喽&#xff0c;大家好&#xff0c;我是雷工。 今天学习JavaScript基础知识的分支语句&#xff0c;以下为学习笔记。 1、程序三大流程控制语句 ○写几句就从上往下执行几句&#xff0c;这种叫做顺序结构&#xff1b; ○有时要根据条件选择执行代码&#xff0c;这种叫分支结构…

深度学习 | Pytorch深度学习实践 (Chapter 10、11 CNN)

十、CNN 卷积神经网络 基础篇 首先引入 —— 二维卷积&#xff1a;卷积层保留原空间信息关键&#xff1a;判断输入输出的维度大小特征提取&#xff1a;卷积层、下采样分类器&#xff1a;全连接 引例&#xff1a;RGB图像&#xff08;栅格图像&#xff09; 首先&#xff0c;老师…

2001-2022年全国290+个地级市高铁开通数据

2001-2022年全国290个地级市高铁开通数据 1、时间&#xff1a;2001-2022年 2、范围&#xff1a;298地级市&#xff08;293地级市数&#xff08;其中莱芜市2019年撤市设区&#xff09;4直辖市数 &#xff09; 3、来源&#xff1a;国家铁路局、铁路客货运输专刊及相关统计 国…

Homeassistant docker配置

Homeassistant docker配置 【说明】本系列为自用教程&#xff0c;记录以便下次使用 【背景】一台J1900 4G64G的小主机&#xff0c;安装了OP系统&#xff0c;里面自带了Docker。为实现Homeassistant&#xff08;简称HA&#xff09;控制智能家居设备&#xff0c;进行如下配置。 【…

使用 Data Assistant 快速创建测试数据集

使用 Data Assistant 快速创建测试数据集 Data Assistant 提供超过 100 种数据类型&#xff0c;为任何开发、测试或演示目的生成大量、异构、真实的数据。 官网地址&#xff1a; http://www.redisant.cn/da 主要功能 Windows 原生 Data Assistant 使用 Windows Native 技术…

Redis常见问题的解决方案(缓存穿透/缓存击穿/缓存雪崩/数据库缓存数据不一致)

Redis解决缓存数据库不一致的方案 用 先 操作数据库 再 操作缓存 的策略来实现缓存数据库数据一致具体做法是 更新数据库数据然后删除缓存 虽然还是会有线程安全问题 比如 假设此时缓存刚好失效了 线程1 查询缓存失败 从数据库读取了旧数据 还没写入缓存的时候 被调度到 线程…

C++标准模板(STL)- 类型支持 (运行时类型识别,type_info )

运行时类型识别 定义于头文件 <typeinfo> 含有某个类型的信息&#xff0c;由实现生成。​​这是 typeid 运算符所返回的类。 std::type_info 定义于头文件 <typeinfo> class type_info; 类 type_info 保有一个类型的实现指定信息&#xff0c;包括类型的名称和…

《机器学习》第6章 支持向量机

文章目录 6.1 间隔与支持向量6.2 对偶问题6.3 核函数支持向量展式核函数 6.4 软间隔与正则化6.5 支持向量回归6.6 核方法6.7 阅读材料 6.1 间隔与支持向量 分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面,将不同类别的样本分开.但能将训练样本分开的划分…

UG\NX二次开发 取消抑制特征 UF_MODL_unsuppress_feature

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 bullzhanghao 订阅本专栏,非常感谢。 简介 UG\NX二次开发 取消抑制特征 UF_MODL_unsuppress_feature 效果 代码 #include "me.hpp" #include <vector> #