文件基本概念

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

转载于:https://www.cnblogs.com/sjxbg/p/5811501.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值