嵌入式Linux _ 标准I/O

一、文件的概念和类型

1、文件IO 与标准IO

  •  IO操作的就是文件。

文件基础:

         一组相关数据的有序集合。

  • Linux中常用的文件类型:

          常规文件   r  (.txt  二进制文件)

          目录文件   d  (文件夹)

          字符设备文件   c  

          块设备文件     b

          管道文件        p (进程间通信机制)

          套接字文件     s  (实现网络通信,进程间通信,本地通信)

          符号链接文件   l

强调:不同的操作系统,支持的文件类型是不同的

二、如何理解标准IO

  • 标准I/O由ANSI C标准定义。   ----- 实际上就是 C库中已经定义好的一组输入输出的函数。

   主流操作系统上都实现了C库。

   标准IO通过缓冲机制减少系统调用,实现更高的效率。

     缓冲机制:数据从文件中读出与写入不需要每次都去访问文件,中间加一个缓冲区,等到缓冲区满足某一个条件将缓冲区中的数据一次性写入文件中,减少访问文件的次数,提高效率。

     系统调用:代码 控制硬件 之间有一层操作系统 统一 分配调用。

三、流(FILE)的含义(了解)

  •   FILE :

       标准IO用一个额结构体类型来存放打开的文件的相关信息。

      标准I/O的所有操作都是围绕FILE来进行。

  • FILE又被称为 流(stream)

    流(stream): 文本流 和二进制流

    Windows 中  区分文本流和二进制流

     二进制流:换行符  ‘\n’

     文本流: 换行符 ‘\r’ ‘\n’

Linux 中:

       换行符  ‘\n’ 

四、流的缓冲类型(熟练)

  • 全缓冲:

     当流的缓冲区无数据或无空间时才执行实际I/O操作。标准I/O中,打开一个普通文件默认的缓冲类型就是------ 全缓冲。

  • 行缓冲:--- 标准输入/输出流 是典型的行缓冲。

     当再输入和输出中遇到换行符(“\n”)时,进行I/O操作。

     当流个一个终端关联时,典型的行缓冲。

  • 无缓冲:

     数据直接写入文件,流不进行缓冲 ------  将一些错误直接打印到终端上。

五、小结

   标准I/O  —  Stdin,stdout stderr

   标准I/O预定义3个流,程序运行时自动打开;

                            

   理解标准IO :实际时标准C库中定义的一组 API

   流的缓冲类型:全缓冲,行缓冲 ,无缓冲

   Stdin  stdout stderr : 程序打开会自动创建。

六、流的打开

  • 下列函数可用于打开一个标准I/O流:

FILE *fopen(const char *path ,const char *mode);

参数:const char *path :指定要打开文件的路径。

      Const char *mode:指定流的打开方式(有六种不同的流的打开方式)

成功时返回流指针,出错时返回NULL

                               

标准I/O — fopen – 实例

   #include  <stdio.h>

Int main(int argc,char *argv[])

{

         FILE *fp;

         If((fp = fopen(“test.txt”,”r+”)) == NULL){

                  Printf(“open error \n”);

                   Return -1;

         }

         ……….

  Return 0;

}

标准I/O – fopen  - 新建文件权限

  • Fopen() 创建的文件访问权限是0666(rw-rw-rw-)可读可写不可执行

                      

                          A  --- 0  八进制

                          

  • Linux系统中umask(存放文件权限掩码,默认022)设定会影响文件的访问权限,其规则为(0666 &~umask)----- 文件初始权限与取反后的umase中的掩码 相与 得到文件最终的权限。
  • 用户可以通过umask 函数修改相关设定
  • 标准I/O – 处理错误信息

           Errno 错误号为1 时:没有权限

          Errno 错误号为11 时:没有资源

  • extern int errno;

     void perror (const char *s);

     char *strerror(int errno);

    — errno   存放错误号

    —  perror 先输出字符串s,再输出错误号对应的错误信息。

    —  sterror 根据错误号返回对应的错误信息。

示例1:

#include <stdio.h>

int main (int argc ,char *argv[])

{

    FILE *fp;

    if((fp = fopen("test.txt","r++")) == NULL)

    {

        perror("fopen");

        return -1;

    }

...............................

}

输出:fopen:No such file or directory

示例2:

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main (int argc ,char *argv[])

{

    FILE *fp;

    if((fp = fopen("test.txt","r++")) == NULL)

    {

        printf("fopen : %s \n",strerror(errno));

        return -1;

    }

...............................

}

 输出:fopen:No such file or directory

七、流的关闭

  •  Int fclose(FILE *steam);

       Fcose()调用成功返回0 ,失败返回EOF,并设置errno

       流关闭时自动刷新缓冲中的数据并释放缓冲区。

      当一个程序正常终止时,所有打开的流都会被关闭。(最好手动关闭掉)

      流一旦关闭后就不能执行任何操作。

  • 思考与练习:

     程序中能够打开的文件或流的个数有限制,如何测试?

    思路:循环打开流,成功则计数累加,直到出错为止,

    答案:1021+stdin+stdout+stderr = 1024.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值