文件的使用

文章目录

  • 1.概念
    • 1.1定义:
    • 1.2分类
      • 1.2.1程序文件
      • 1.2.2数据文件
        • 1.概念
        • 2.存储方式
    • 1.3文件名
  • 2.文件的使用
    • 2.1文件指针
    • 2.2开闭函数
    • 2.3顺序读写
      • 2.3.1何为读写
      • 2.3.2读写函数
        • 1.字符输出fputc(输出到文件 写到文件中)
        • 2.字符输入fgetc(输入到程序 读到程序中)
        • 3.文本行函数
        • 4.格式化函数
          • 4.1...scanf--printf
          • 4.2...fscanf--fprintf
          • 4.3...sscanf--sprintf
        • 5.二进制函数
    • 2.4.随机读写
      • 2.4.1功能函数
      • 2.4.2读取结束判定
        • 1.feof函数的使用
        • 2.判定是否读取结束
  • 3.文件缓冲区
    • 3.1介绍
    • 3.2缓冲文件系统
    • 3.3冲刷函数fflush

1.概念

1.1定义:

文件:电脑文件,计算机文件。存储在长期储存设备(磁盘、光盘、磁带)或临时存储设备(计算机内存)中的一段数据流,归属于计算机文件系统管理下。

存储于长期存储设备的文件:
1.长期存储
2.程序或系统运行产生的临时数据,于程序或系统退出后删除。

1.2分类

1.2.1程序文件

源程序文件(.c)
目标文件(.obj)
可执行程序(.exe)。

1.2.2数据文件

程序
程序运行时读写的数据
程序运行读取数据或输出内容的文件

根据数据组织形式,数据文件分为:文本文件和二进制文件

1.概念

文本文件:
存在外存之前进行转换,以 ASCII 码形式存储。

二进制文件:
在内存中以二进制的形式存储,不加转换输出到外存。

2.存储方式

① 字符以 ASCII 形式存储
② 数值型数据
ASCII 形式
二进制形式

1.3文件名

文件存在的标识,操作系统根据文件名对其进行控制和管理。不同操作系统对文件命名规则略有不同,文件名的格式和长度因系统而异。为方便区分计算机中不同文件,给每个文件设定指定名称。

组成:
文件路径 + 文件名主干 + 文件后缀
C:\code2023\ test4_29 .txt

2.文件的使用

2.1文件指针

指向文件信息区(文件在内存中开辟的一个FILE结构体变量)的指针变量

2.2开闭函数

#include<stdlib.h>
打开:
FILE *fopen( const char *filename, const char *mode );
关闭:
int fclose( FILE *stream );

示例:
#include <stdio.h>
 int main(void) 
 {
    FILE* pf = fopen("test.dat", "w");

    FILE* pf = fopen("C:\\code2023\\test4_29.txt", "w");
    if (pf == NULL) 
    {
        perror("fopen");
        return 1;
    }
   fclose(pf);
   pf = NULL; 
   return 0;
 }


  • 程序能够打开的文件有限,文件属于一种资源。如果不释放,文件会被占用。可能会导致一些操作被缓冲在内存中,缓冲在内存中的数据不能正常写入文件中导致数据丢失。

2.3顺序读写

2.3.1何为读写

程序位于内存
数据位于硬盘上的文件

文件拿出数据:输入/读取(r)
程序存到文件:输出/写入(w)

2.3.2读写函数

1.字符输出fputc(输出到文件 写到文件中)

int fputc( int c, FILE *stream );
无符号字符输出到流
#include <stdio.h>
 int main(void) 
 {  
    写文件-->程序输出到文件
    w:无此文件创立文件
       覆盖文件原有内容
    FILE* pf = fopen("test.txt", "w");
    if (pf == NULL) 
    {
        perror("fopen");
        return 1;
    }
    fputc('a', pf);
    fputc('b', pf);
    fputc('c', pf);
 
    fputc('a', stdout);
    
    fclose(pf);
    pf = NULL;
    return 0;
}

2.字符输入fgetc(输入到程序 读到程序中)

int fgetc( FILE *stream );
从流中读取字符
成功返回ASCII值
失败返回EOF
#include <stdio.h>
int main(void) 
{
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL) 
    {
        perror("fopen");
        return 1;
    }
    int ret = fgetc(pf);
    printf("%c\n", ret);
    ret = fgetc(pf);
    printf("%c\n", ret);
    ret = fgetc(pf);
    printf("%c\n", ret);

    int ret = fgetc(stdin);
    
    fclose(pf);
    pf = NULL;
    return 0;
}

3.文本行函数

输出:
int fputs( const char *string, FILE *stream );
fputs("abcdef\n", pf);
输入:
char *fgets( char *string, int n, FILE *stream );
fgets(arr, 4, pf);

点击 fgets函数详解 对fgets函数有更深刻的认识

4.格式化函数

4.1…scanf–printf
输出:
int printf( const char *format [, argument]... );
printf("%d", a);
printf("Hello,World!\n");
输入:
int scanf( const char *format [,argument]... );
scanf("%d %d", &a, &b);
4.2…fscanf–fprintf
输出:
int fprintf( FILE *stream, const char *format [, argument ]...);
fprintf(pf, "%s %d %f", p1.name, p1.dpi, p1.sens);
输入:
int fscanf( FILE *stream, const char *format [, argument ]... );
fscanf(pf, "%s %d %f", p1.name, &(p1.dpi), &(p1.sens));
4.3…sscanf–sprintf
输出:
int sprintf( char *buffer, const char *format [, argument] ... );
输入:
int sscanf( const char *buffer, const char *format [, argument ] ... );

示例:
#include <stdio.h>
struct S 
{
	char arr[10];
	int age;
	float f;
};
int main() 
{
	struct S s = { "hello", 20, 3.14f };
	struct S tmp = { 0 };
    char buffer[100] = { 0 };
    
	sprintf(buffer, "%s %d %f", s.arr, s.age, s.f); 
	printf("%s\n", buffer);
	
    sscanf(buffer, "%s %d %f", tmp.arr, &(tmp.age), &(tmp.f));
	printf("%s %d %f\n", tmp.arr, tmp.age, tmp.f);
 
	return 0;
}

scanf 标准格式化输入 - stdin
fscanf 所有输出流格式化输出- stdin / 文件
sscanf 从字符串中读取格式化数据

printf 标准格式化输出 - stdout
fprintf 所有输出流格式化输出 - stdout /文件
sprintf 格式化数据转换成字符串

输出/写入函数
输入/读至程序

5.二进制函数

输出:
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
fwrite(&s, sizeof(struct S), 1, pf);
输入:
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
fread(&s, sizeof(struct S), 1, pf);

点击 阿猿的《通讯录》查看通讯录,可以对上述函数又更清晰的理解

2.4.随机读写

2.4.1功能函数

int fseek( FILE *stream, long offset, int origin );移动指针到指定位置
origin:SEEK_CUR  当前位置
② SEEK_END  末尾位置
③ SEEK_SET  起始位置
fseek(pf, 5, SEEK_CUR); 

long ftell( FILE *stream );返回与起始位置的偏移量
int ret = ftell(pf);
 
void rewind( FILE *stream );文件指针复位
rewind(pf);

2.4.2读取结束判定

1.feof函数的使用

int feof( FILE *stream );
读取结束:
读取失败   返回0
遇到文件尾 返回非0

int ferror( FILE *stream );
流中读取错误  返回非0
流中读取成功  返回0


#include <stdio.h>
#include <stdlib.h>
int main() 
{
    int ch = 0; 
    FILE* pf = fopen("test.txt", "r");
    if (!pf) 
    {  
        perror("fopen");
        return EXIT_FAILURE; //执行程序失败
    }
    // fgetc - 读取失败或文件结束返回EOF
    while ((ch = fgetc(pf)) != EOF) 
        putchar(ch);
    printf("\n");
    if (ferror(pf))
        puts("I/O error when reading)");        //读取失败
    else if (feof(pf))
        puts("End of file reached successfully");//遇到文件尾
    fclose(pf);
    pf = NULL;
    return 0;
}

2.判定是否读取结束

① fgetc
读取结束返回 EOF
成功返回字符 ASCII 码
② fgets
读取结束返回 NULL
成功返回字符串首地址
③ fread
读取结束返回 读取元素个数

3.文件缓冲区

3.1介绍

为缓和 CPU 与 I/O 设备之间速度不匹配,文件缓冲区用以暂时存放读写期间的文件数据而在内存区预留的一定空间。使用文件缓冲区可减少读取硬盘的次数。

3.2缓冲文件系统

系统自动地在内存为程序中每一个正在使用的文件开辟一块文件缓冲区。

  • 从内存向磁盘输出数据,先送到内存中的缓冲区,缓冲区装满后一起输送到磁盘上。
  • 从磁盘向计算机读入数据,从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),从缓冲区逐个地将数据送到程序数据区(程序变量等)。
  • 缓冲区的大小根据C编译系统决定。

3.3冲刷函数fflush

int fflush( FILE *stream );
将缓冲区内数据写到stream 指定文件。
成功返回 0 
错误返回 EOF 
高版本vs无法使用
fclose关闭文件时也会刷新缓冲区

#include <stdio.h>
#include <windows.h>
int main() 
{
	FILE* pf = fopen("test7.txt", "w");
	if (!pf)
	{
		perror(fopen);
		return 1;
	}
	fputs("abcdef", pf); //数据输出到buffer
	                     //此时文件中无内容
	Sleep(10000);        //睡眠10s
	fflush(pf);          //刷新缓冲区
	Sleep(10000);        //睡眠10s
	                     //此时数据到达文件
	fclose(pf);
	pf = NULL;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring 的创建和使用

目录 一. 创建 Spring项目 二. 存储 Bean 对象到Spring中 1. 添加Spring配置文件 2. 创建一个 Bean 对象 3. 将 Bean 存储到 Spring 容器中 三. 从 Spring 中获取并使用 Bean 对象 1. 创建 Spring 上下文 1.1 使用 ApplicationContext 作为Spring上下文 1.2 使用 Bea…

线性回归模型(7大模型)

线性回归模型&#xff08;7大模型&#xff09; 线性回归是人工智能领域中最常用的统计学方法之一。在许多不同的应用领域中&#xff0c;线性回归都是非常有用的&#xff0c;例如金融、医疗、社交网络、推荐系统等等。 在机器学习中&#xff0c;线性回归是最基本的模型之一&am…

深入理解 Linux 内核

Linux 内核系列文章 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 文章目录 Linux 内核系列文章前言一、内存寻址1、内存地址2、硬件中的分段&#xff08;1&#xff09;段选择符 3、Linux 中的分段&#xff08;1&#xff09;Linux GDT&…

IPsec中IKE与ISAKMP过程分析(快速模式-消息1)

IPsec中IKE与ISAKMP过程分析&#xff08;主模式-消息1&#xff09;_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析&#xff08;主模式-消息2&#xff09;_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析&#xff08;主模式-消息3&#xff09;_搞搞搞高傲的博客…

九款顶级AI工具推荐

ChatGPT OpenAI开发的最强对话系统 地址&#xff1a;chat.openai.com ChatGPT能够在同一个会话期间内回答上下文相关的后续问题。其在短时间内引爆全球的原因在于&#xff0c;在网友们晒出的截图中&#xff0c;ChatGPT不仅能流畅地与用户对话&#xff0c;甚至能写诗、撰文、编…

【远程工具】- Tabby 下载、安装、使用、配置【ssh/Serial】-免安装、解压即用

目录 一、Tabby 概述 二、Tabby 下载、安装 三、Tabby 的使用  &#x1f449;3.1 使用SSH协议连接Linux开发主机  &#x1f449;3.2 使用Serial(串口)协议连接开发板 一、Tabby 概述 在远程终端工具中&#xff0c;secureCrt 和 XShell 是两款比较有名的远程工具&#xff0c;但…

尚融宝26-投标

目录 一、需求 &#xff08;一&#xff09;投资人投标 &#xff08;二&#xff09;流程 二、标的详情 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;后端 &#xff08;三&#xff09;前端 三、计算收益 &#xff08;一&#xff09;四种还款方式 &#…

windows10系统如何实现telnet内网穿透

在windows10系统环境中&#xff0c;我们常用的内网穿透方案是远程桌面内网穿透技术方案&#xff0c;存在的弊端是它属于视窗类操作工具。网上很多教人开启windows10的telnet服务的帖子&#xff0c;凡是通过系统设置进入启用或关闭windows应用后勾选telnet客户端这种方式&#x…

Codeforces Round 865 (Div. 2)

6 problems. ABC过, DE没想出来, F没看. https://codeforces.com/contest/1816 A. Ian Visits Mary 分析 - AC 每次跳跃&#xff0c;横纵互质。 限于数据量&#xff0c;不能枚举。 1与任何数互质。考虑从(0,0)跳到(1,y)&#xff0c;这一步一定合法&#xff1b;再从(1,y)跳到…

《Netty》从零开始学netty源码(四十七)之PooledByteBuf的方法

setBytes() 从channel中读取数据并写到PooledByteBuf中&#xff0c;分配缓存的过程与getBytes一样&#xff0c;只是duplicate为false。 capacity() 动态更新容量&#xff0c;根据新传入的容量值更改length。 如果新容量值与旧值相同则无需扩容如果为非池化内存则根据新容量值…

制造策略 ETO、MTO、ATO、MTS

ETO 按交货周期跨度从长到短来讲&#xff0c;首先就是 ETO&#xff0c;Engineer To Order – 面向订单设计、定制生产或特殊生产。 就是客户给的订单&#xff0c;你要生产的话&#xff0c;你之前的原产品改动很大&#xff0c;或者基本上用不上&#xff0c;要完全按照客户的要求…

从0搭建Vue3组件库(十):如何搭建一个 Cli 脚手架

本篇文章将实现一个名为create-easyest脚手架的开发,只需一个命令npm init easyest就可以将整个组件库开发框架拉到本地。 创建 Cli 包 首先,我们在 packages 目录下新建 cli 目录,同执行pnpm init进行初始化,然后将包名改为create-easyest 这里需要知道的是当我们执行npm in…

细讲shell中的循环语句--for语句

目录 一:何为循环 1.循环概述 2.使用循环的好处 二&#xff1a;for循环语句 1.for语句的用法 ​2. 语法结构 &#xff08;1&#xff09;一般格式 &#xff08;2&#xff09;类C语言格式 &#xff08;3&#xff09;死循环 3.事例 ​4.常用转义符 5.制作九九乘法表 三&…

利用Ad Hoc传感器网络上的局部信息组织全球坐标系(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 知道通信网络中节点的地理位置通常是有用的&#xff0c;但在每个节点上添加GPS接收器或其他复杂的传感器可能会很昂贵。 本文…

English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三

English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三 主题整体听一遍精听句子 1扩展 way of doing | way to do sth 句子 2扩展 Expression扩展 base 句子 3句子 4扩展 red-hot 句子 5句子 6扩展 fiery 句子 7句子 8句子 9句子 10句子 11扩展 born 句子 12句子 13句子…

平均10870元!2023一季度居民可支配收入公布(文末附最新招聘岗位)

今天是五一假期的第一天&#xff0c;暂别职场的打工人已经开始扎入人从众中放肆玩乐了&#xff0c;小编已经流下了羡慕的泪水。不过&#xff0c;今年的五一除了人流量上暴涨之外&#xff0c;出行成本也没被少吐槽&#xff0c;机票咱就不说了&#xff0c;酒店民宿的涨幅简直到了…

[AION]我眼中的《永恒之塔私服》

当我第一次看到《永恒之塔私服》我被它那华丽的画面吸引了。      三维做的很逼真&#xff0c;他的三维技术&#xff0c;华丽的三维景象&#xff0c;从maya设计者专业的角度上说&#xff0c;他是一部做工完美的游戏&#xff0c;不管是他的背景还是他的人物。都比以前很多游…

ROS导航包Navigation中的 Movebase节点路径规划相关流程梳理

本文主要介绍ROS导航包Navigation中的 Movebase节点中的路径规划的相关流程&#xff0c;并对其进行梳理概括&#xff0c;同时本文也是《ROS局部路径规划器插件teb_local_planner规划流程概括总结》部分的前述文章。 1、接收到目标点信息goal 在接收到目标点goal之后&#xff0c…

《站在巨人的肩膀上学习Java》

Java从诞生距今已经有28年了&#xff0c;在这段时间里&#xff0c;随着Java版本的不断迭代&#xff0c;Java新特性的不断出现&#xff0c;使得Java被使用的越来越广泛。在工程界Java语言一直是大家最喜欢的语言之一&#xff0c;Java一直排行在编程语言热门程度的前3名。 可想而…

基于rke部署的k8s集群如何配置kube-proxy工作在ipvs模式

kube-proxy默认工作在iptables模式下&#xff0c;在集群配置文件cluster.yml中添加如下配置项即可开启ipvs模式。然后执行 rke up 命令使配置生效。