【UNIX】什么是标准IO

标准IO是在系统调用函数基础之上构造的,它便于用户使用,标准IO就是对文件IO的一种封装。

标准IO库以及头文件<stdio.h>为底层IO系统调用提供了一个统一的接口,通俗的说就是,一个应用程序需要访问内核的系统调用,可以通过文件IO来调用,优化了文件IO的缓存分配问题,以及选择什么样是个的块长度。

对于每个被使用的文件都在内存中开辟了一个区域,用来存放文件的相关信息,而这些信息被保存在一个结构体变量中,这个结构体类型由操作系统来定义的,取名为FILE。

这就是下面所说的文件指针

对于标准IO库都是围绕着流来进行的,而在标准IO,流用FILE*来描述。


流:所有的IO操作仅是简单的从程序的进程中移进或者移出,这种字节流,就称为流。(文本流/二进制流)

对于文本流:在处理数据的时候一字符形式出现的,'\n'回车符被转换成CR换行符LF,而对于数字被转换成ASCII码的形式存在。

而对于二进制流;在处理数据的时候一二进制的形式处理数据,就是01机器码。


流(编程对象)

  • 在计算机编程中,流就是一个类的对象,很多文件的输入输出操作都以 类的成员函数的方式来提供。
    计算机中的流其实是一种信息的转换。它是一种有序流,因此相对于某一对象,通常我们把对象接收外界的信息输入(Input)称为输入流,相应地从对象向外输出(Output)信息为输出流,合称为输入/输出流(I/O Streams)。对象间进行信息或者数据的交换时总是先将对象或数据转换为某种形式的流,再通过流的传输,到达目的对象后再将流转换为对象数据。所以,可以把流看作是一种数据的载体,通过它可以实现数据交换和传输。

就跟文件IO一样,标准IO也有一系列的读写打开操作。

对于标准IO的open函数有如下几种形式:

/*
* FILE *fopen (const char *path,const char *mode);
* FILE *fdopen(int fd,const *path,const char *mode);
* int fd = open (const *path,int flags,mode_t mode);
* FILE *freopen (argv[1],"w+",stdout);
* 
*/

#include
   
   
    
    
#include
    
    
     
     
#include
     
     
      
      

#define lockfile "/tec/tmp/text.c"

int main ()
{
    FILE *fp;
    
    fp = fopen (lockfile,"r+");
    
    if (fp == NULL){
        perror("this is");
        exit(-1);
    }else{
        fclose(fp);
        
        return 0;
    }
}
/*
*对于“”双引号里的表示有几种形式“r+”r,w,w+,a,a+
*对于加号表示已读写的方式打开,r表示文件必须存在,不存在则返回错误,
*而W表示已创建的方式打开,但是文件已有文件会被清零
*对于a表示已追尾的方式创建,文件已存在,不会被清零
*
*
*/

//example 2

#include
      
      
       
       
#include
       
       
         #include 
        
          int main (int argc,char *argv[]) { FILE *fp; if (argc <2){ fprintf(stdout,"usage\n",argv[0]); return -1; } if ((fp = fopen (argv[1],"a+")) == NULL){ perror("fopen"); return -1; } printf("before fopen \n"); freopen(argv[1],"r",stdout); printf("after fopen" ); freopen("/dev/tty","w+",stdout); printf("end main\n"); return 0; } 
         
       
      
      
     
     
    
    
   
   

fclose ()成功调用则返回0,失败返回EOF。在调用fclose()函数对流之后对流的操作都是未知的,非法的。

对于fopen打开的文件可以进行读入写出操作

那么对于标准IO的读写有三种不同的方式:

第一种就是一个字符的读写:fgetc和fputc

第二种是行的读写:fgtes 和fputs

第三种是对于某种数量的结构读写; fread fwrite

对于读写的结束判定;feof(fp) != EOF

对于标准输入输出设备的读写函数:

#include
   
   
    
    

int main ()
{
    int c;
    while((c = getc(stdin)) != EOF)
        if (putc(c,stdout) == EOF)
            perror("out error");
            
    if (ferror(stdin))
        perror("input error");
        
    return 0;
}

//example 2

int main ()
{
    char buf[max];

    while(fgets(buf,,max,stdin) != NULL)
        if (fputs(buf,stdout) == EoF)
            perror(" output error");
    if (ferror(stdin))
        perror("stdin error");
        
    return 0;
}










 

   
   









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值