首页 > 其他分享 >C语言--文件操作

C语言--文件操作

时间:2023-05-07 14:03:55浏览次数:32  
标签:文件 stream -- C语言 int pf FILE size

  • 什么是文件

磁盘上的文件就是文件,但是在程序设计中,我们一般谈的文件有两种:程序文件,数据文件

程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序文件(windows环境下后缀名为.exe)

数据文件

文件的内容不一定是程序,而是程序运行时候写的数据,比如程序运行需要从中读取文件或者是输出内容文件


  • 文件名

一个文件要有一个唯一的文件标识,以使用户识别和引用,文件名包含3部分:文件路径+文件名主干+文件后缀

比如:C:\code\test.txt     为了方便,文件标识常被成为文件名

  • 文件类型

根据数组的组织形式,数据文件被称为文本文件或者二进制文件

数据在内存中以二进制的形式进行存储,如果不能加转换的输出到外存,就是二进制文件

如果要求在外存以上ASCII妈都形式存储,则需要在存储前转换,以ASCII字符的形式存储的文件就是文本文件

字符一律以ASCII码值进行存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储

如有整数10000,如果以ASCII码形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上之战4个字节。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <stdio.h>
int main()
{
	int n = 10000;
	FILE* ps=fopen("test.txt","wb");
	fwrite(&n, 4, 1, ps);
	fclose(ps);
	ps = NULL;
	return 0;
}

C语言--文件操作_数据


  • 文件缓冲区

ANSIC标准采用“缓冲文件系统”处理的文件,所谓的缓冲文件系统指的是自动的在内存中为程序中的每一个正在使用的文件开辟一个“文件缓冲区”,从内存向磁盘输出数据会先送到内存中的缓冲区,等缓冲区装满后在一起送到磁盘上,如果磁盘向计算机读入数据则同理。

C语言--文件操作_文件名_02

int main()
{
	while (1)
	{
		printf("hehe ");
	}
}
//这连个代码在gcc编译器下输出结果有差异,
//上面的是不停的打印hehe,下面的是等一段时间打印很多hehe,在等一段时间,再打印很多hehe
int main()
{
	while (1)
	{
    sleep(1);
		printf("hehe ");
	}
}


  • 文件指针

缓冲文件系统中,关键的概念是:“文件类型指针”,简称“文件指针”

       每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件的状态以及文件的地址等等),这些信息都是保存在一个结构体变量中的,该结构体类型是有系统声明的,取名为FILE

不同的编译器可能对结构体的定义不一样,但是大同小异

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中信息,使用则不必关心其中细节

一般都是通过FILE指针来维护FILE结构体变量

定义pf是一个指向FILE类型的指针变量,可以使用pf指向某个文件的文件信息区(是一个结构体变量),通过该文件信息区中的信息就能访问该文件,也就是说通过文件指针变量就能够找到与它相关联的文件

C语言--文件操作_文件指针_03

  • 文件的打开和关闭
FILE *fopen(const char* filename,const char* mode) //文件名,打开文件的方式
  int fclose(FILE* stream);

文件的使用方法

C语言--文件操作_数据_04

注意:打开方式要是只写的话,则该文件里原本的内容会消失,因为“写”会新创建一个文件,追加可以保留原内容

  • 文件的顺序读写
fputc(char contact,char* stream)
fgetc(char* stream)

一个程序会默认打开三个流,一个是标准输入流---stdin  标准输出流---stdout,标准错误流stderr    这三个流都是FILE*类型的

从流里面获取一个字符

char* fgets(char* string,int n,FILE* stream)
  string --- 读取的字符串存放的位置
  n --- 最大读几个字符
  stream --- 从哪个文件读


printf/scanf      是针对标准输入/输出流  格式化输入/输出语句

fprintf/fscanf    是针对所有输入/输出流 格式化输入/输出语句

sprintf/sscanf   sscanf是从字符串中读取格式化的数据   sprintf是把格式化的数据输出成(存储到)字符串中

以二进制的形式读写

size_t fread(const void* buffer,size_t size,size_t count,FILE* stream);
读到了返回1,读不到返回0
buffer:从哪读
size:大小
count:数量
stream:读到哪去
size_t fwrite(const void* buffer,size_t size,size_t count,FILE* stream);
  • 文件的随机读写

fseek:根据文件指针的位置和偏移量来定位文件

int fseek(FILE* stream,long int offset,int origin);

origin 的三个值:SEEK_CUR   SEEK_END  SEEK_SET

C语言--文件操作_文件名_05

举例

int main()
{
	FILE* pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		
		return 0;
	}

	//定位
	fseek(pf,4,SEEK_SET);

	int ch = fgetc(pf);
	printf("%c\n", ch);

	fclose(pf);
	pf = NULL;

	return 0;
}

ftell:返回文件指针相对于起始位置的偏移量

rewind:让文件指针的位置回到文件的起始位置

  • 文件结束的判定

feof:在文件读取过程中,不能使用feof返回值来直接判断文件是否结束,而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束

  1. 文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者是NULL(fgets)
  2. 二进制文件的读取结束判断,返回值是否要小于读取结束的个数

如果文件打开什么都没有,则获取就是-1;

EOF---END OF FILE 文件结束标志   

ferror--检测流上的一个错误
















标签:文件,stream,--,C语言,int,pf,FILE,size
From: https://blog.51cto.com/u_15841362/6251907

相关文章

  • 第十节(变量作用域)
    前面的笔记中介绍过在函数内部声明的变量与在函数外部声明的变量不同。其实这已经介绍了变量作用域的概念,只是你还不知道而已。变量作用域是C语言中的重要部分。本次将介绍以下内容:●变量作用域的概念及其重要性●什么是外部变量,为何要避免使用它们●局部变量的细节●静态变量和自......
  • IDEA 设置JSP启动页面/默认页面
    一图街千惑额在项目中WEB-INF中的web.xml文件中配置项目的默认启动页面。web.xml 是个XML格式的文件<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc......
  • LDAP备份迁移和LDAP主从配置,阿里云服务器做主,内网机做从,zabbix,gilab,jumpserver接入lda
    一,LDAP备份迁移1,原服务器上导出备份文件mkdir/opt/ldap/usr/sbin/slapcat>/opt/ldap/ldapdbak.ldif2,目标服务器搭建ldap环境yuminstallopenldapopenldap-clientsopenldap-serversserviceslapdstartsystemctlenableslapdslappasswd-h{SSHA}-sxxxxx #生成管理......
  • 分享Python采集80个jQuery代码,总有一款适合您
    Python采集的80个jQuery代码下载链接:https://pan.baidu.com/s/1TeAqNtMgbrQyaF5cg6dt6A?pwd=d51f提取码:d51f基于HTML5SVG的炫酷进度条插件js全屏快速预览图片特效jquery滑动侧边栏插件jSidejs和CSS3图片360度全方位3D预览插件jQuery和CSS3滑动展开菜单按钮插件33种css3开关按钮特......
  • 字符串的反转---Java
    定义一个方法,实现字符串的反转键盘输入一个字符串,调用方法后,输出结果 例如: 键盘输入:abc 输出结果:cbapackagestring.practice;/**定义一个方法,实现字符串的反转*键盘输入一个字符串,调用方法后,输出结果*例如:*键盘输入:abc*输出结果:cba*/importjava.util.......
  • 拼接最大数(栈、贪心)、发奖金问题、二叉搜索树迭代器(栈、树)
    拼接最大数(栈、贪心)给定长度分别为m和n的两个数组,其元素由0-9构成,表示两个自然数各位上的数字。现在从这两个数组中选出k(k<=m+n)个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。求满足该条件的最大数。结果返回一个表示该最大......
  • flume java.lang.OutOfMemoryError: GC overhead limit exceeded
    http://java-boy.iteye.com/blog/463454解决办法:<1>ps-aux|grepflume查看刚才启动的flume进程,发现如下信息/usr/jdk/bin/java-Xmx20m-Dflume.root.logger=INFO-cpconf<2>于是看一个flume-ng的python脚本,发现JAVA_OPTS="-Xmx20m"问题就是出在这里了,然后我把flume-ng脚本......
  • zabbix基于api方式批量创建监控项和触发器示例
    基于python3zabbixapi方式,达到批量创建指定机器业务端口的监控项和触发器的创建的效果,目前不支持并发处理,只支持串行处理zabbix-net-server.py内容,放到zabbix服务器上,然后执行python3 zabbix-net-server.py启动socket监听#!/usr/bin/python3importsocket,sys,timeimport......
  • zookeeper-3.4.9的安装
    下载地址http://mirrors.cnnic.cn/apache/zookeeper/stable/下载wgethttp://mirrors.cnnic.cn/apache/zookeeper/stable/zookeeper-3.4.9.tar.gz解压usr/bigdata/zookeeper-3.4.9添加myid文件cdusr/bigdata/zookeeper-3.4.9mkdirdatacddataecho"1">myid修改zoo.......
  • 使用git add添加完文件,想要撤销
    gitresetHEAD<file>...参考https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%92%A4%E6%B6%88%E6%93%8D%E4%BD%9C......