C语言入门篇——文件操作篇

2023-05-16

目录

1、为什么使用文件

2、什么是文件

2.1程序文件

2.2数据文件

2.3文件名

3、文件的打开和关闭

3.1文件指针

3.2文件的打开和关闭

4、文件的顺序读写

5、文件的随机读写

5.1fseek

5.2ftell

5.3rewind

6、文本文件和二进制文件

7、文件读取结束的判定

8、文件缓冲区


1、为什么使用文件

程序的数据是存放在内存中,当程序退出的时候,程序的数据自然就不存在了,等下一次运行我们的程序就需要重新输入自己的数据,这样就比较麻烦。数据持久化的方法一般有:吧数据存放在错案文件和存放到数据库等方式,我们使用文件的时候就可以把数据直接存放到电脑的硬盘上,做到了数据了持久化。

2、什么是文件

文件(file)通常是在磁盘或固态硬盘上的一段已命名的存储区。对我 们而言,stdio.h就是一个文件的名称,该文件中包含一些有用的信息。然 而,对操作系统而言,文件更复杂一些。例如,大型文件会被分开储存,或 者包含一些额外的数据,方便操作系统确定文件的种类。然而,这都是操作 系统所关心的,程序员关心的是C程序如何处理文件。

C把文件看作是一系列连续的字节,每个字节都能被单独读取。C提供两种文件模式:文本模式和二进制模式。

要区分文本内容和二进制内容、文本文件格式和二进制文件格 式,以及文件的文本模式和二进制模式。

所有文件的内容都以二进制形式(0或1)储存。但是,如果文件最初使用二进制编码的字符表示文本,该文件就是文本文件,其中包含文本内容。如果文件中的二进制值代表机器语言代码或数值数据或图片或音乐编码,该文件就是二进制文件,其中包含二进制内容。

为了规范文本文件的处理,C 提供两种访问文件的途径:二进制模式和 文本模式。在二进制模式中,程序可以访问文件的每个字节。而在文本模式 中,程序所见的内容和文件的实际内容不同。程序以文本模式读取文件时, 把本地环境表示的行末尾或文件结尾映射为C模式。

除了以文本模式读写文本文件,还能以二进制模式读写文本文件。

在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。

2.1程序文件

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

2.2数据文件

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

2.3文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。

文件名包含3部分:文件路径+文件名主干+文件后缀,例如:D:\资料\vs\test

为了方便起见,文件标识常被称为文件名。

3、文件的打开和关闭

3.1文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
       };
typedef struct _iobuf FILE;

 不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。 每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息, 使用者不必关心细节。 一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

FILE* pf = NULL;

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

3.2文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。 在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。 ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。

//打开文件
FILE* fopen(const char* filename,const char* mode);
函数作用:打开文件
参数:filename:文件名
    mode:文件使用方式
返回值:成功:文件流指针
        失败:NULL

//关闭文件
int fclose(FILE* stream);
函数作用:关闭文件
参数:stream:文件指针流
返回值:成功:0
        失败:EOF(-1)
文件打开方式
文件使用方式含义如果至指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建议一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件

 

4、文件的顺序读写

功能函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

 这里介绍fscanf,fprintf,fread,fwite四个函数。

fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件。

函数原型如下:
int fscanf ( FILE *fp, char * format, ... );
int fprintf ( FILE *fp, char * format, ... );

函数参数:
fp 为文件指针;
format 为格式控制字符串;
... 表示参数列表;

fprintf() 返回成功写入的字符的个数,失败则返回负数
fscanf() 返回参数列表中被成功赋值的参数个数

与 scanf() 和 printf() 相比,它们仅仅多了一个 fp 参数

 两个函数的测试代码为:

int main(void)
{
	FILE* pf1 = NULL;
	pf1 = fopen("test.txt", "w");
	if (pf1 == NULL)
	{
		printf("打开文件失败\n");
		return -1;
	}

	char buf[1024] = "helloworld!";
	fprintf(pf1, "%s", buf);
	fclose(pf1);

	return 0;
}

int main(void)
{
	FILE* pf2 = NULL;

	pf2 = fopen("test.txt", "r");
	if (pf2 == NULL)
	{
		printf("打开文件失败\n");
		return -1;
	}

	char data[1024] = { 0 };
	int ret = fscanf(pf2, "%s", data);

	printf("ret:%d\n", ret);

	printf("data:%s\n", data);
	fclose(pf2);
	return 0;
}

 

 fread() 函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制。fread() 的原型为:

size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );

 fwrite() 函数用来向文件中写入块数据,它的原型为:

size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );

 对参数的说明:

  • ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr 用来存放要写入的数据。
  • size:表示每个数据块的字节数。
  • count:表示要读写的数据块的块数。
  • fp:表示文件指针。
  • 理论上,每次读写 size*count 个字节的数据。

size_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。

返回值:返回成功读写的块数,也即 count。如果返回值小于 count:

  • 对于 fwrite() 来说,肯定发生了写入错误,可以用 ferror() 函数检测。
  • 对于 fread() 来说,可能读到了文件末尾,可能发生了错误,可以用 ferror() 或 feof() 检测。

这两个函数的测试代码如下:

int main(void)
{
	FILE* pf1 = NULL;
	pf1 = fopen("test1.txt", "wb+");
	if (pf1 == NULL)
	{
		printf("打开文件失败\n");
		return -1;
	}

	char buf[1024] = { "hadhasio" };
	fwrite(buf, sizeof(buf), 1, pf1);
	fclose(pf1);

	return 0;
}

int main(void)
{
	FILE* pf2 = NULL;

	pf2 = fopen("test1.txt", "rb+");
	if (pf2 == NULL)
	{
		printf("打开文件失败\n");
		return -1;
	}

	char data[1024] = { 0 };
	int ret = fread(data, sizeof(data), 1, pf2);

	printf("ret:%d\n", ret);

	printf("data:%s\n", data);
	fclose(pf2);
	return 0;
}

5、文件的随机读写

5.1fseek

函数功能是把文件指针指向文件的开头,需要包含头文件stdio.h

函数原型:
int fseek(FILE *stream, long int offset, int whence)

参数:stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流
    offset -- 这是相对 whence 的偏移量,以字节为单位
    whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:

返回值:
如果成功,则该函数返回零,否则返回非零值。
常量描述
SEEK_SET文件的开头
SEEK_CUR文件指针的当前位置
SEEK_END文件的末尾

 测试代码如下:

int main()
{
	FILE* fp = NULL;

	fp = fopen("test.txt", "w+");
	if (fp == NULL)
	{
		printf("打开文件失败\n");
		return -1;
	}
	fputs("This is sakura0908", fp);

	fseek(fp, 7, SEEK_SET);
	fputs(" C Programming Langauge", fp);

	fclose(fp);

	return(0);
}

5.2ftell

返回给定流 stream 的当前文件位置,需要包含头文件stdio.h

函数原型:
long int ftell(FILE *stream);

参数:stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流

返回值:该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值

测试代码案例如下:

int main()
{
    FILE* fp = NULL;
    int len;

    fp = fopen("test.txt", "r");
    if (fp == NULL)
    {
        perror("打开文件错误");
        return(-1);
    }
    fseek(fp, 0, SEEK_END);

    len = ftell(fp);
    fclose(fp);

    printf("test.txt 的总大小 = %d 字节\n", len);

    return(0);
}

5.3rewind

设置文件位置为给定流 stream 的文件的开头,需要包含头文件stdio.h

函数原型:
void rewind(FILE *stream);

参数:
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流

返回值:
该函数不返回任何值

 测试代码案例如下:

int main()
{
   char str[] = "This is runoob.com";
   FILE *fp;
   int ch;

   /* 首先让我们在文件中写入一些内容 */
   fp = fopen( "file.txt" , "w" );
   fwrite(str , 1 , sizeof(str) , fp );
   fclose(fp);

   fp = fopen( "file.txt" , "r" );
   while(1)
   {
      ch = fgetc(fp);
      if( feof(fp) )
      {
          break ;
      }
      printf("%c", ch);
   }
   rewind(fp);
   printf("\n");
   while(1)
   {
      ch = fgetc(fp);
      if( feof(fp) )
      {
          break ;
      }
      printf("%c", ch);
     
   }
   fclose(fp);

   return(0);
}

 

6、文本文件和二进制文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文 本文件。 一个数据在内存中是怎么存储的呢? 字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而 二进制形式输出,则在磁盘上只占4个字节(VS2022测试)。

测试代码:

int main()
{
     int a = 10000;
     FILE* pf = fopen("test.txt", "wb");
     fwrite(&a, 4, 1, pf);//二进制的形式写到文件中
     fclose(pf);
     pf = NULL;
     return 0;
}

7、文件读取结束的判定

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。

而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如: fgetc 判断是否为 EOF 或 fgets 判断返回值是否为 NULL .

2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如: fread判断返回值是否小于实际要读的个数。

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

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

    return 0;
}

8、文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装 满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

 因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文 件。 如果不做,可能导致读写文件的问题。刷新缓冲区作用的函数有fflush函数和fclose函数

fflush函数:刷新缓冲区,某些编译器不支持,vs2022是不支持的。

fclsoe函数:关闭文件的时候,也会刷新缓冲区。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言入门篇——文件操作篇 的相关文章

  • 网络---字节序

    字节序 xff1a xff43 xff50 xff55 对内存中数据以字节为单位进行存取的顺序 主机字节序分为 xff1a 大端字节序 xff1a 低地址存高位 小端字节序 xff1a 低地址存低位 地址指内存地址 xff1b 在内存中 x
  • mmdetection ---转onnx模型,Netron可视化网络结构

    详细信息可以看官方文档 xff1a docs en tutorials pytorch2onnx md 这里把命令摘了出来 用法 span class token comment bash span python tools span cl
  • 链路层--->ETH(以太网)协议

    文章目录 ETH xff08 以太网 xff09 协议格式 xff1a ARP协议格式 链路层负责相邻设备之间的数据帧传输 xff0c 典型协议有 xff1a ETHH xff08 以太网协议 xff09 xff0c ARP协议 MTU x
  • BFS练手题目

    文章目录 1 员工的重要性2 腐烂的橘子3 N 叉树的层序遍历4 单词接龙5 最小基因变化6 打开转盘锁 广度优先搜索 xff08 BFS xff09 算法 xff0c 概念就不说啥了 xff0c 常用来求最短路径 xff0c 最少步数等
  • 回溯算法练习题

    回溯是一个常见的算法 xff0c 类似于深搜 广搜 xff0c 会穷举每一个可能 但是会有一个恢复选择的操作 算法核心框架如下 xff1a span class token keyword for span 选择 in 选择列表 xff1a
  • ACM输入输出练习--字符串分割

    ACM输入输出练习 学会即可举一反三 xff0c 主要针对字符串类型分割处理 这里利用getline 和字符串流来分割字符串并格式化输出 xff0c 思路大概如此 span class token macro property span c
  • Spark与hive集成、Hive On Spark 、使用Spark SQL进行数据查询配置流程

    本文主要是介绍在开源hadoop上使用Spark SQL进行数据查询 有关本文的各组件版本如下 xff1a 1 hadoop版本 span class token namespace root 64 hadoop01 span span c
  • 虚拟机网络配置中的几个相关文件

    1 cd etc sysconfig network scripts 目录下的 ifcfg eno 文件 2 more etc hosts 3 more etc hostname 问题记录 Vmware有三种网络连接模式 xff1a 桥接
  • DB2实现判断字符串是否只含数字

    背景 取出客户表中客户姓名字段含数字且只含数字的数据 最开始考虑的是使用正则表达式函数 xff0c 后来发现DB2没有像Oracle一样可以直接使用的正则表达式函数 xff0c 因此考虑使用其他方法 结论 使用DB2的translate函数
  • 华为ELK的几个知识点

    1 ELK是运行在FusionInsight HD平台中的 安装ELK之前必须先安装FusionInsight HD集群 2 ELK依赖FusionInsight HD中的两个组件 xff0c 分别是HDFS和Yarn 3 ELK必须部署在
  • Python 中获取字典的key列表和value列表

    coding utf 8 定义一个字典 dic 61 39 剧情 39 11 39 犯罪 39 10 39 动作 39 8 39 爱情 39 3 39 喜剧 39 2 39 冒险 39 2 39 悬疑 39 2 39 惊悚 39 2 39
  • su oracle 和 su - oracle的区别

    最近整oracle xff0c 发现su oracle过来sqlplus一直报命令不存在 后来发现是因为用su oracle切换的 xff0c 导致还是用的root的环境变量 xff0c 所以才会导致sqlplus命令不存在 xff0c 改
  • 关于Oracle 11g的RAC和Oracle 19c 的RAC在JDBC连接时的一些区别

    19c中新增的 v services可以查询各PDB对应的服务名 xff0c 根据此服务名去写JDBC的连接参数 而非19c中常用的v database视图显示的是CDB的库名 还有 show paramerter service name
  • ORA-31626 ORA-01658 使用impdp遇到的问题

    oracle使用impdp导库时遇到的问题 xff0c span class token punctuation span oracle span class token variable 64 qsrac2 span span class
  • linux安装oracle客户端——SQL*Loader

    背景 在安装Oracle数据库的时候 xff0c 一般是默认安装客户端的 但是有些特殊情况 xff0c 需要在应用服务器上安装客户端 xff0c 用于执行一些特殊操作 xff0c 此时需要安装oracle的客户端 xff0c 如使用sqll
  • 如何获取oracle的dmp文件中的表空间名称或Schema

    场景 在给定的dmp下 xff0c 使用impdp导入时 xff0c 报了一个错 xff0c 大致就是说schema在dmp中不存在 xff08 使用impdp导入时指定了schemas 61 XXX XXX XXX xff09 当时懒得去

随机推荐

  • 搭建Hadoop最少需要几个节点

    可以按服务所需的最小节点数进行规划 zookeeper服务 zookeeper服务最少需要3个节点 xff0c 且扩展时需为奇数个才行 HDFS HDFS中的NameNode需要2个节点 xff0c 主备配置 因此hadoop最小需要3个节
  • “远程“操作oracle数据泵impdp、expdp导入导出

    关键词 xff1a NFS 数据泵 impdp expdp oracle客户端 本文解决的主要问题 靠考如下场景 xff0c 你作为一个DBA xff0c 管理者测试环境的Oracle集群 正常情况下测试环境恢复生产数据都是由DBA来做 x
  • 数仓拉链表的缺点

    在选定拉链表时由于对于哪些表适合做拉链表没有一个统一的规范的认识 xff0c 因此出现了以下情况 xff1a 一个表是做的全量拉链表 xff0c 但是没有注意该表数据不是每天都有供数 即 xff0c 可能某一天源系统供给了该表 xff0c
  • oracle监听、启动等命令

    记录一些常用的查看状态和重启数据库的命令 监听 单机版一般为lsnrctl xff0c 集群一般为crsctl lsnrctl Listener Control 在数据库单机环境下使用lsnrctl命令 lsnrctl status 查看状
  • 多进程的python实现

    span class token keyword import span os span class token keyword import span time span class token comment os fork 负责创建一
  • Python三目运算符(三元运算符)用法详解

    我们从一个具体的例子切入本节内容 假设现在有两个数字 xff0c 我们希望获得其中较大的一个 xff0c 那么可以使用 if else 语句 xff0c 例如 xff1a if a gt b max 61 a else max 61 b 但
  • du -sh 和ls -lh的区别

    du sh显示的是文件占用的大小 ls lh显示的文件的实际大小 这里系统层面涉及一个Block Size的概念 xff0c 具体不深究 简而言之 xff0c 假如一个Block是4K xff0c 如果文件A的大小是1K xff0c 那么用
  • docker镜像创建、删除等相关操作

    一 docker镜像的形式 可以为一个tar包 xff0c 如 centos tar 此处为一个现成的镜像 使用方法为 1 加载镜像 span class token punctuation span root 64 hadoop01 sp
  • shell中的数组、循环等基本用法和注意事项

    shell中数组的表示 方法 xff1a array name 61 ele1 ele2 ele3 elen 举例 xff1a span class token punctuation span root 64 hadoop01 span
  • 离线安装rpm包

    离线安装rpm包 安装 repotrack 工具下载依赖包其他常用命令 安装 repotrack 工具 找一台在线的机器 xff08 虚拟机 xff09 xff0c 配置好yum源 span class token punctuation
  • 更改yum源

    Error Failed to download metadata for repo appstream Cannot prepare internal mirrorlist No URLs in mirrorlist 参考连接
  • 在docker中使用sqlplus

    1 找个带sqlplus的镜像 从docker hub上下载https hub docker com r sflyr sqlplus docker pull sflyr sqlplus 2 在k8s中运行 由于该镜像启动后没有运行的程序 x
  • C++常用库函数

    C 43 43 常用库函数 1 常用数学函数 头文件 include lt math gt 或者 include lt math h gt 函数原型 功能 返回值 int abs int x 求整数x 的绝对值 绝对值 double aco
  • 基于GEC6818的触摸屏

    1 输入子系统 连接操作系统的输入设备 xff0c 可不止一种 xff0c 也许是一个标准PS 2键盘 xff0c 也许是一个USB鼠标 xff0c 或者是一块触摸屏 xff0c 甚至是一个游戏机摇杆 xff0c Linux在处理这些纷繁各
  • c语言实现udp广播和组播

    目录 1 UDP广播通信 2 UDP组播通信 1 UDP广播通信 单播 xff1a 数据包发送方式只有一个接受方 广播 xff1a 同时发给局域网中的所有主机 只有用户数据报套接字 xff08 使用UDP协议 xff09 才能广播 以192
  • Odoo10 中常见的 Widget 整理

    Widget是什么 是odoo中字段的显示形式 Odoo内置的widget widget 61 34 mail thread 34 xff1a 消息标签 widget 61 34 html 34 xff1a html相关标签 widget
  • C语言入门篇——介绍篇

    目录 1 什么是C语言 1 C语言的优点 3 语言标准 4 使用C语言的步骤 5 第一个C语言程序 6 关键字 1 什么是C语言 1972年 xff0c 贝尔实验室的丹尼斯 里奇和肯 汤普逊在开发UNIX操作系统时设计了C语言 xff0c
  • 力扣刷题——双数之和

    很多人去力扣刷题都是数组的第一题 xff0c 也就是双数之和 xff0c 相信这也是很多人劝退题目 xff0c 甚至对自己学过的知识产生了怀疑 xff0c 这真的是我学完C语言 xff0c Java xff0c Python或C 43 43
  • C语言入门篇——自定义数据篇

    目录 1 结构体 1 2 匿名结构体 1 3 结构体的自引用 1 4 结构体的声明和初始化 1 5 结构体的内存对齐 1 6 修改默认对齐数 1 7 结构体传参 2 枚举 3 共用体 xff08 联合体 xff09 1 结构体 设计程序时
  • C语言入门篇——文件操作篇

    目录 1 为什么使用文件 2 什么是文件 2 1程序文件 2 2数据文件 2 3文件名 3 文件的打开和关闭 3 1文件指针 3 2文件的打开和关闭 4 文件的顺序读写 5 文件的随机读写 5 1fseek 5 2ftell 5 3rewi