文件基本概念
Posted 芬乐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件基本概念相关的知识,希望对你有一定的参考价值。
1. 外部介质,外部介质是针对内存来说的 ,输入输出设备,比如键盘/显示器以及打印机等,将计算机操作外部设备,包括驱动程序,都是以读写文件的模式交换信息的。就和linux一样,一切皆文件。
2. 文件的分类:
- 按文件的逻辑结构
- 记录文件:由具有一定结构的记录组成(定长和不定长)
- 流式文件:由一个个字符(字节)数据顺序组成 ,没有大小,实时传送的,像正在视频聊天的数据就是
- 按存储介质:
- 普通文件:存储介质文件(磁盘,磁带等)
- 设备文件:非存储介质(键盘,显示器,打印机等)
- 按数据的组织形式:
- 文本文件:ASCII文件,每个字节存放一个字符的ASCII码
- 二进制文件:数据按其在内存中的存储形式原样存放。像txt就是文本文件,exe就是二进制文件。
3. 文件的标识:
为什么要这样做,因为C语言把所有的设备都当作文件
每个文件都以文件名为标识,I/O设备的文件名是系统定义的,如:
COM1或AUX 第一串行口,附加设备
COM2 第二串行口,此外,还可能有COM3,COM4等。
CON 控制台(console ),键盘膜(输入用)或显示器(输出用)
LPT1或PRN 第一并行口后打印机
LPT2 第二并行口,还可能有LPT3等
NUL 空设备
磁盘文件可以由用户自己命名,但上述被系统(windows和dos下均是如此)保留的设备名字不能用作文件名,如不能把一个文件命名为CON(不带扩展名)或CON.TXT(带扩展名)。
4. 流
- 流是一个动态的概念,可以将一个字节形象地比喻成一滴水,字节在设备、文件和程序之间的传输就是流,类似于水在管道中的传输,可以看出,流是对输入输出源的一种抽象,也是对传输信息的一种抽象。通过对输入输出源的抽象,屏蔽了设备之间的差异,使程序员能以一种通用的方式进行存储操作,通过对传输信息的抽象,使得所有信息都转化为字节流的形式传输,信息解读的过程与传输过程分离。
- C语言中,I/O操作可以简单地看作是从程序移进或移出字节,这种搬运的过程便称为流(stream)。程序只需要关心是否正确地输出了字节数据,以及是否正确地输入了要读取字节数据,特定I/O设备的细节对程序员是隐藏的。
5. 文件处理方法
- 缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区
- 非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区
6. 缓冲区
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { FILE *fp = open("c:\\\\1.txt","w");
fputs("Hello, world", fp); //写入到缓冲区 fclose(fp); //关闭文件的时候,将缓冲区内容写入文本 }
- fopen的参数
- a+尾部添加,文件指针在尾部。
- b+文件指针在头部,会清空原先内容。
- r+文件指针在头部,不会清空内容。
- 缓冲文件系统为了保护磁盘寿命,把分批次完成的任务汇集在一起,一次性完成。
7. 文件指针
- 文件指针是操作系统来管理的,文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件。
- FILE其实是一个结构体。文件关闭后,它的文件结构体被释放。
-
struct _iobuf { char *_ptr;//当前缓冲区内容指针 int _cnt;//缓冲区还有多少个字符 char *_base;//缓冲区的起始地址 int _flag;//文件流的状态,是否错误或者结束 int _file;//文件描述符 int _charbuf;//双字节缓冲,缓冲2个字节 int _bufsiz;//缓冲区大小 char *_tmpfname;//临时文件名 }; typede f struct _iobuf FILE;
- C语言程序在进行文件操作时遵循如下操作步骤:打开->读写操作->关闭,通俗地说,打开是获取文件结构、系统为文件分配缓冲区的过程,不打开文件就不能对其进行读写,关闭是释放缓冲区和其他资源的过程,不关闭文件就会慢慢耗光系统资源,。
- 在进行文件操作时,系统自动与3个标准设备文件联系,这3个文件无需打开和关闭,它们的文件指针分别是:
nstdin:标准输入文件指针,系统分配为键盘。nstdout:标准输出文件指针,系统分配为显示器。nstderr:标准错误输出文件指针,系统分配为显示器。
-
举例来说,从文件输入和向文件输出有两个对应函数fscanf和fprintf,两个函数的原型分别为:int fprintf(FILE* ofp,控制字符串,参数表);int fscanf(FILE* ifp ,控制字符串,参数表);
-
参数表中参数的个数同样是任意的,fprintf函数用于将转换后的控制字符串写出到ofp指向的文件中,fscanf用于从ifp指向的文件中读取字节信息为参数表中的参数赋值。
-
标准输入输出函数printf和scanf实际上等价于:fprintf(stdout, 控制字符串,参数表)fscanf(stdin, 控制字符串,参数表)
-
int main() { char str[1024] = {0}; //上下效果一样 //scanf("%s", str); //printf("%s", str); fscanf(stdin, "%s", str); fprintf(stdin, "%s", str); fprintf(stderr, "\\nerror-%s", str); system(str); }
-
stdin和stdout都可以重定向,stderr不可以。
如果你有一些文件不需要重定向,就可以把它定义为stderr
以上是关于文件基本概念的主要内容,如果未能解决你的问题,请参考以下文章
html PHP代码片段: - AJAX基本示例:此代码演示了使用PHP和JavaScript实现的基本AJAX功能。