C语言基础—文件


1、C 语言中的文件是什么

所谓文件(file)一般指存储在外部介质上数据的集合,比如我们经常使用的 txt、bmp、jpg、exe、rmvb 等。这些文件各有各的用途,我们通常将它们存放在磁盘或者可移动盘等介质中

文件无非就是一段数据的集合,这些数据可以是有规则的集合,也可以是无序的集合。操作系统也就是以文件为单位对数据进行管理的。也就是说,要访问外部介质上的数据,必须按照文件名进行查找,然后从该文件中读取数据。要想写数据到外部介质,必须得建立一个文件,然后再写入。因此,你眼前的文件只是数据的集合

1.1 文件一般包括三要素:文件路径、文件名、后缀

由于在 C 语言中 ’ \ ’ 一般是转义字符的起始标志,故在路径中需要用两个 ’ \ ’ 表示路径中目录层次的间隔,也可以使用 ’ / ’ 作为路径中的分隔符

举个简单的例子:“C:\user\test.c” 或者 “C:/user/test.c”,表示文件 test.c 保存在 C 盘 user 目录下
                             “tu.txt” 表示当前目录下的文件 tu.txt
文件路径:可以显示指出其绝对路径,如上面的 “C:\” 或者 “C:/” 等。如果没有显示指出其路径,默认为当前路径,也就是相对路径

数据的输入和输出几乎伴随着每个 C 语言程序,所谓输入就是从 “源端” 获取数据,所谓输出可以理解为向 “终端” 写入数据。这里的源端可以是键盘、鼠标、硬盘、光盘】扫描仪等输入设备,终端可以是显示器、硬盘、打印机等输出设备。在 C 语言中,把这些输入和输出设备也可以看作是 “文件”

1.2 C 语言文件系统中的类型

FILE:对象类型,足以保有控制 C I/O 流所需的全部信息

fpos_t:非数组完整对象类型,足以唯一指定文件的位置和多字节剖析状态

每个 FILE 对象直接或间接保有下列信息:

  • (C95)字符宽度:未设置、窄或宽
  • (C95)多字节与宽字符间转换的分析状态(mbstate_t 类型对象)
  • 缓冲状态:无缓冲、行缓冲、全缓冲
  • 缓冲区:可为外部的用户提供缓冲区所替换
  • I/O 模式:输入、输出或更新(兼具输入和输出)
  • 二进制 / 文本模式指示器
  • 文件尾指示器
  • 错误状态指示器
  • 文件位置指示器,可作为 fpos_t 类型对象访问,对于宽流包含剖析状态
  • (C11)在多个线程读、写、寻位或查询流时避免数据竞争的再入锁

【注】类型 mbstate_t 是平凡非数组类型,能表示任何出现于实现定义的受支持多字节编码规则集合的转换状态。mbstate_t 的零初始化值表示初始转换状态,尽管亦可能存在 mbstate_t 的其它值表示初始转换状态。mbstate_t 的可行实现是一个结构体类型,保有表示不完整多字节字符的数组、指示数组中已处理字节数和当前迁移状态的表示。

1.3 预定义标准流
  • stdin 与标准输入流关联的 FILE* 类型表达式
  • stdout 与标准输出流关联的 FILE* 类型表达式
  • stderr 与标准错误输出流关联的 FILE* 类型表达式
1.4 宏常量
  • EOF:int 类型的负值整数常量表达式 // #define EOF (-1)
  • FOPEN_MAX:能同时打开的文件数 // #define FOPEN_MAX 20
  • FILENAME_MAX:保有最长受支持文件名所需的 char 数组大小 // # define FILENAME_MAX 260
  • BUFSIZ:setbuf() 所用的缓冲区大小 // # define BUFSIZ 512
  • _IOFBF:指示全缓冲 I/O 的setvbuf() 参数 // #define _IOFBF 0x0000
  • _IOLBF:指示行缓冲 I/O 的setvbuf() 参数 // #define _IOLBF 0x0040
  • _IONBF:指示全缓冲 I/O 的setvbuf() 参数 // #define _IONBF 0x0004
  • SEEK_SET:指示从文件首开始寻位的 fseek() 参数 // #define SEEK_SET 0
  • SEEk_CUR:指示从文件当前位置开始寻位的 fseek() 参数 // #define SEEk_CUR 1
  • SEEK_END:指示从文件尾开始寻位的 fseek() 参数 // #define SEEK_END 2
  • TMP_MAX:tmpnam 所能生成的最大独有文件数 // #define TMP_MAX 32767
  • TMP_MAX_S:tmpnam_s 所能生成的最大独有文件数
  • L_tmpnam:保有 tmpnam 结果所需的 char 数组大小
  • L_tmpnam_s:保有 tmpnam_s 结果所需的 char 数组大小
1.5 文件操作函数
  • fopen:返回值,文件指针FILE*,两个参数(文件名,模式(以什么方式打开文件))
  • fclose:参数只有一个,释放的文件流指针 1. 防止内存泄漏 2. 未释放文件再次打开可能回发生错误
  • fread:返回值,返回实际读取的项目数
  • fwrite:返回值,返回实际写入的项目数,四个参数:1.准备写入到文件中的数据 2.写入项目的大小 3.写入项目的个数 4.被写入的文件位置
  • fseek:把与 fp 有关的文件位置指针放到一个指定位置
  • ftell:返回当前问文件指针的位置,这个位置是指当前文件指针相对于文件开头的位移量

2、流的概念及分类

I/O 设备的多样性及复杂性,给程序设计者访问这些设备带来了很大的难度和不便。为此,ANSIC 的 I/O 系统即标准 I/O 系统,把任意输入的源端或任意输出的终端,都抽象转换成了概念上的 “标准 I/O 设备” 或称 “标准逻辑设备”。程序绕过具体设备,直接与该 “标准逻辑设备” 进行交互,这样就为程序设计者提供了一个不依赖于任何具体 I/O 设备的统一操作接口,通常把抽象出来的 “标准逻辑设备” 或 “标准文件” 称作 “流”

把任意 I/O 设备,转换成逻辑意义上的标准 I/O 设备或 标准文件 的过程,并不需要程序设计者感知和处理,是由标准 I/O 系统自动转换完成的。故从这个意义上,可以认为任意输入的源端和任意输出的终端均对应一个 “流”

  • 流按方向分为:输入流和输出流。从文件获取数据的流称为输入流,向文件输出数据称为输出流
  • 流按数据形式分为:文本流和二进制流。文本流是 ASCII 码字符序列,而二进制流是字节序列
  • 流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动

在这里插入图片描述

3、文本文件和二进制文件到底有什么区别

根据文件中数据的组织形式的不同,可以把文件分为:文本文件和二进制文件

  • 文本文件:把要存储的数据当成一系列字符组成把每个字符的 ASCII 码值存入文件中每个 ASCII 码值占一个字节,每个字节表示一个字符。故文本文件也称作字符文件或 ASCII 文件,是字符序列文件
  • 二进制文件:把数据对应的二进制形式存储到文件中,是字节序列文件

在这里插入图片描述

4、C 语言与文件读写

文件库函数 stdio.h 链接: http://www.cplusplus.com/reference/cstdio/

C 语言操作文件分为三步,1)打开文件, 2)读写文件, 3)关闭文件

4.1 打开文件函数原型:FILE* fopen ( const char* filename, const char* mode );

函数参数:

  • filename:文件名,包括路径,如果不显示含有路径,则表示当前路径。例如:“C:\user\test.txt” 表示 C 盘 user 目录下的 test.txt 文件。“test.txt” 表示当前目录下的文件 test.txt
  • mode:文件打开模式,指出对该文件可进行的操作。常见的打开模式如:“r” 表示只读,“w” 表示只写,“rw” 表示读写,“a” 表示追加写入

图示:
在这里插入图片描述
返回值:打开成功,返回该文件对应的 FILE 类型的指针;打开失败,返回 NULL。故需定义 FILE 类型的指针变量,保存该函数的返回值。可根据该函数的返回值判断文件打开是否成功

4.2 关闭函数 fclose 的原型:int fclose ( FILE* stream );
  • 函数参数:
               stream,指向要关闭流对象的指针
  • 返回值:
               如果流被成功关闭,返回 0 值。若失败,返回 EOF(-1)
               即使调用失败,作为参数传递的流将不再与文件或其缓冲区关联
4.3 字符串格式化函数原型:int sprintf ( char* str, const char* format, … )
  • 函数参数:
               str,指向缓冲区指针,缓冲区足够大
               format,格式化字符串,该字符串遵循与 printf 中的格式相同的规范
               ...,附加参数(可变 根据格式化字符串的不同,函数可能需要一系列附加参数,每个参数都包含一个值,用于替换格式字符串中的格式说明符)
  • 返回值:
               如果成功,将返回写入的字符总数。此计数不包括自动附加在字符串末尾的额外空字符。失败则返回负数

示例:
在这里插入图片描述
【注】Windows OS 上的 C 流在输出时将 ‘\n’ 转换为 ‘\r\n’,输入时将 ‘\r\n’ 转换为 ‘\n’

4.4 格式化写入函数:int fprintf ( FILE* stream, const char* format, … )

输出函数:int printf ( const char * format, … );

#include <stdio.h>
#include <stdlib.h>
int main()
{
   
	int ar[] = {
    12,23,34,45,56,67,78,89,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值