设为首页 加入收藏

TOP

第10章 对文件的输入输出(一)
2019-06-27 00:06:03 】 浏览:335
Tags:文件 输入 输出

10.1 C文件的有关基本知识

10.1.1 什么是文件

文件有不同的类型,在程序设计中,主要用到两种文件:

(1) 程序文件。包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等。这种文件的内容是程序代码。

(2) 数据文件。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中输出到磁盘(或其他外部设备)的数据,或在程序运行过程中供读入的数据。如一批学生的成绩数据、货物交易的数据等。

说明:

为了简化用户对输入输出设备的操作,使用户不必去区分各种输入输出设备之间的区别,操作系统把各种设备都统一作为文件来处理。从操作系统的角度看,每一个与主机相连的输入输出设备都看作一个文件。例如,终端键盘是输入文件,显示屏和打印机是输出文件。

文件(file)一般指存储在外部介质上数据的集合。操作系统是以文件为单位对数据进行管理的。

输入输出是数据传送的过程,数据如流水一样从一处流向另一处,因此常将输入输出形象地称为流(stream),数据流

流表示了信息从源到目的端的流动。在输入操作时,数据从文件流向计算机内存,在输出操作时,数据从计算机流向文件(如打印机、磁盘文件)。

C的数据文件由一连串的字符(或字节)组成,而不考虑行的界限,两行数据间不会自动加分隔符,对文件的存取是以字符(字节)为单位的。输入输出数据流的开始和结束仅受程序控制而不受物理符号(如回车换行符)控制,这就增加了处理的灵活性。这种文件称为流式文件

10.1.2 文件名

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

文件标识包括3部分: (1)文件路径; (2)文件名主干; (3)文件后缀。

(1) 文件路径表示文件在外部存储设备中的位置

(2) 文件名主干的命名规则遵循标识符的命名规则

(3) 文件后缀用来表示文件的性质

 

常见的后缀有:mp3 mp4 docx pptx jpg png 等

为方便起见,文件标识常被称为文件名,但应了解此时所称的文件名,实际上包括以上3部分内容,而不仅是文件名主干。

根据数据的组织形式,数据文件可分为ASCII文件二进制文件

说明:

数据在内存中是以二进制形式存储的,如果不加转换地输出到外存,就是二进制文件,可以认为它就是存储在内存的数据的映像,所以也称之为映像文件(image file)。如果要求在外存上以ASCII代码形式存储,则需要在存储前进行转换。ASCII文件又称文本文件(text file),每一个字节存放一个字符的ASCII代码。

既可以用ASCII形式存储,也可以用二进制形式存储。

 

说明:

用ASCII码形式输出时字节与字符一 一对应,一个字节代表一个字符,因而便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间(二进制形式与ASCII码间的转换)。用二进制形式输出数值,可以节省外存空间和转换时间,把内存中的存储单元中的内容原封不动地输出到磁盘(或其他外部介质)上,此时每一个字节并不一定代表一个字符。

简单来说,就是如果使用ASCII码需要进行转换,而使用二进制则不需要转换。

10.1.4 文件缓冲区

ANSI C标准采用“缓冲文件系统”处理数据文件,所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区。

解释: 从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。这样做是为了节省存取时间,提高效率,缓冲区的大小由各个具体的C编译系统确定。

说明:

每一个文件在内存中只有一个缓冲区,在向文件输出数据时,它就作为输出缓冲区,在从文件输入数据时,它就作为输入缓冲区。

简单来说,就是程序运行为了节省存取时间,提高效率,则我们就需要使用到缓冲区。

10.1.5 文件类型指针

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

说明:

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

一种C编译环境提供的stdio.h头文件中有以下的文件类型声明:

typedef struct

{ short level;    //缓冲区“满”或“空”的程度

unsigned flags;   //文件状态标志

char fd;     //文件描述符

unsigned char hold;   //如缓冲区无内容不读取字符

short bsize;    //缓冲区的大小

unsigned char*buffer; //数据缓冲区的位置

unsigned char*curp;  //文件位置标记指针当前的指向

unsigned istemp;  //临时文件指示器

short token;    //用于有效性检查

}FILE;

FILE *fp;

//定义一个指向FILE类型数据的指针变量

解释:

可以使fp指向某一个文件的文件信息区(是一个结构体变量),通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。如果有n个文件,应设n个指针变量,分别指向n个FILE类型变量,以实现对n个文件的访问。为方便起见,通常将这种指向文件信息区的指针变量简称为指向文件的指针变量

注:指向文件的指针变量并不是指向外部介质上的数据文件的开头,而是指向内存中的文件信息区的开头。

 

10.2 打开与关闭文件

对文件读写之前应该“打开(Open)”该文件,在使用结束之后应“关闭(Close)”该文件。

说明:

   “打开”是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。在编写程序时,在打开文件的同时,一般都指定一个指针变量指向该文件,也就是建立起指针变量与文件之间的联系,这样,就可以通过该指针变量对文件进行读写了。

   “关闭”是指撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件,显然就无法进行对文件的读写了。

10.2.1 用fopen函数打开数据文件

ANSI C规定了用标准输入输出函数fopen来实现打开文件。

Open函数的调用方式为

fopen(文件名,使用文件方式);

[例] fopen使用示例

FILE*fp;    //定义一个指向文件的指针变量fp

fp=fopen(″a1″,″r″); //将fopen函数的返回值赋给指针变量fp,表示以“读入”方式打开名字为a1的文件

在打开一个文件时,通知编译系统以下3个信息:

① 需要打开文件的名字,也就是准备访问的文

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇leadcode的Hot100系列--序 下一篇第9章 用户自己建立数据类型

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目