文件基本概念

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

以上是关于文件基本概念的主要内容,如果未能解决你的问题,请参考以下文章

前端开发必备!Emmet使用手册

c_cpp Robolution基本代码片段

html PHP代码片段: - AJAX基本示例:此代码演示了使用PHP和JavaScript实现的基本AJAX功能。

python 模块的概念介绍

初学者 CodeIgniter 概念 - 可重用的视图代码,该去哪里? (帮手?)

多线程编程