io进程测试题_buffer io error on dev

io进程测试题_buffer io error on dev1.IO的概念理解#includestdio.h//其中的的stdio便是我们经常使用的IO,这个属于系统IO2.IO的分类2.1标准IO(库函数)//上方的举例便属于标准IOprintfscanffopenfre

io进程测试题_buffer

目录

1.        IO的概念理解

2.        IO的分类

3.        FIEL结构体

4.        IO接口函数(标准IO)

         4.1        fopen( 功能:打开一个文件)

                4.2        fclose(功能:关闭一个文件)

        4.3        strerror(根据错误码返回错误信息) 

        4.4        perror(功能:打印错误信息)

        4.5        fgetc/fputc(功能:从文件读取/写入一个字符串)

5.        标准IO缓冲区

                5.1        缓冲区的大小

                5.2       行缓存刷新机制

                5.3        全缓存刷新机制

                5.4        主动刷新缓冲区


1.        IO的概念理解

#include<stdio.h>  //其中的的stdio 便是我们经常使用的IO,这个属于系统IO

2.        IO的分类

        2.1        标准IO(库函数)     //上方的举例便属于标准IO

                      printf scanf fopen fread fwrite fclose fgetc fputc fgets fputs.都属于标准IO

        2.2        文件IO(系统调用)

                      open read write close都属于文件IO

        系统调用和库函数分别是什么:系统调用是用户访问内核空间的一个过程,效率比较低,每次系统调用都要从用户空间到内核空间调用一次内核。而库函数相当于系统调用+缓冲区实现的,可移植性比较强,执行效率高。

3.        FIEL结构体

        3.1        FIEL结构体用来描述打开的文件的,只要打开一个文件,就会产生FIEL结构体,在一个已经运行的程序中默认产生三个FILE结构体:

//三个FIEL结构体

stdin:标准输入
stdout:标准输出
stderr:标准出错

4.        IO接口函数(标准IO)

           4.1        fopen( 功能:打开一个文件)

                      功能、参数、返回值如下:

                        

#include <stdio.h>

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

功能:打开一个文件

参数: @pathname:文件的路径及文件的名字(字符指针)
       
         @mode:打开文件的方式
                 r:    以只读的方式打开文件,将光标定位在文件的开头

                 r+:    以读写的方式打开文件,将光标定位在文件的开头

                 w:    以只写的方式打开文件,如果文件不存在创建文件,
                       如果文件存在清空文件,将光标定位在文件的开头

                 w+:    以读写的方式打开文件,如果文件不存在创建文件,
                        如果文件存在清空文件,将光标定位在文件的开头

  		         a:以只写的方式打开文件,如果文件不存在就创建,
                    如果文件存在将光标定位在文件的结尾

		         a+:以读写的方式打开文件,如果文件不存在就创建,
                     如果文件存在写在结尾写,如果文件存在读在开头读
             
返回值:成功返回FILE的指针,失败返回NULL,置位错误码

   fopen使用示例:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp;
    //以只写的方式打开文件,如果文件不存在就创建文件
    // ./test.txt 文件的路径和文件的名字
    //"r" 权限
    fp = fopen("./test.txt","r");
    if(fp == NULL){
        printf("open file error\n");
        return -1;
    }
    printf("open file success\n");
    return 0;
}                       

              4.2        fclose(功能:关闭一个文件)

                          功能、参数、返回值如下:

#include <stdio.h>

int fclose(FILE *stream);

功能:关闭文件

参数:@stream:文件指针


返回值:成功返回0,失败返回-1(EOF),置位错误码

fclose示例:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp;
    //以只写的方式打开文件,如果文件不存在就创建文件
    //“./test.txt”文件的路径和文件的名字
    //"w" 权限
    fp = fopen("./test.txt","w");
    if(fp == NULL){
        printf("open file error\n");
        return -1;
    }
    printf("open file success\n");

    //关闭文件
    if(fclose(fp)){
        printf("close file error\n");
        return -1;
    }
    fclose(stdin);
    fclose(stdout);
    fclose(stderr);
    return 0;
}                       

        4.3        strerror(根据错误码返回错误信息) 

                功能、参数、返回值如下:                   

#include <string.h>

char *strerror(int errnum);

功能:根据错误码,转换出来错误信息

参数:@errnum:错误码

返回值:错误信息

        strerror示例:

#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno;

int main(int argc, char const *argv[])
{
    FILE *fp;

    fp = fopen("./test.txt","r");
    if(fp == NULL){
        printf("errno = %d\n",errno);
        //将错误信息通过printf打印出来
        printf("%s\n",strerror(errno));
        printf("open file error\n");
        return -1;
    }
    printf("open file success\n");
    return 0;
}          

错误码原理:fopen会调用底层的sys_open,sys_open执行失败时将程序的错误码传递给errno的变量,可以通过这个变量获取到底层的错误。

        4.4        perror(功能:打印错误信息)

                功能、参数、返回值如下:

void perror(const char *s);

功能:直接打印错误信息 (自动加上'\n')

参数:@s:用户附加的错误信息

返回值:无

         perror示例:

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


int main(int argc, char const *argv[])
{
    FILE *fp;

    fp = fopen("./test.txt","r");
    if(fp == NULL){
        perror("open file");
        return -1;
    }
    printf("open file success\n");
    return 0;
}               

        4.5        fgetc/fputc(功能:从文件读取/写入一个字符串)

                功能、参数、返回值:         

int fgetc(FILE *stream);

功能:从文件中读取一个字符

参数:
        @stream:FILE的结构体指针

返回值:成功返回读取到字符的ascii码,失败返回EOF(-1)
       
//--------------------------------------------------------------------------------------

int fputc(int c, FILE *stream);

功能;向文件中写一个字符

参数:
       @c:被写的字符
  	    @stream:FILE指针

返回值:成功返回读取到字符的ascii码,失败返回EOF(-1)

        fgetc/fputc示例:

#include <stdio.h>

#define PRINT_ERR(msg) do{ \
        perror(msg);\
        return -1;\
    }while(0)

int main(int argc, char const *argv[])
{
    char ch;
    FILE *fp;
    //1.打开文件
    fp = fopen("./hello.txt","r");
    if(fp == NULL)
        PRINT_ERR("open error");
    //2.读取文件中的字符
    ch = fgetc(fp);
    printf("ch = %c\n",ch);

    //3.关闭文件
    fclose(fp);
    return 0;
}
#include <stdio.h>

#define PRINT_ERR(msg) do{ \
        perror(msg);\
        return -1;\
    }while(0)

int main(int argc, char const *argv[])
{
    FILE*fp;
     //1.参数检查
    if(argc != 2){
        printf("input error,try again\n");
        printf("usage: ./a.out filename\n");
        return -1;
    }
    //2.打开文件
    if((fp = fopen(argv[1],"w+")) == NULL)
        PRINT_ERR("open file error");
        
    //3.向文件中写入hello
    fputc('h',fp);
    fputc('e',fp);
    fputc('l',fp);
    fputc('l',fp);
    fputc('o',fp);

    //4.关闭文件
    fclose(fp);

    return 0;
}

5.        标准IO缓冲区

                5.1        缓冲区的大小

                                全缓存:文件的缓冲区就是全缓存,大小是4096

                                行缓存:和终端相关的相关缓冲区就是行缓存(stdin stdout),大小就是1024

                                不缓存:没有缓冲区(stderr),大小就是0

                5.2       行缓存刷新机制

                                1.行缓存在遇到‘\n’的时候会刷新缓冲区

                                2.行缓存在在程序结束的时候,也会刷新缓冲区

                                3.标准输入和标准输出发生切换的时候也会刷新缓冲区

                                4.当文件关闭的时候也会刷新缓冲区

                                5.当主动调用fflush的时候也会刷新缓冲区

                                6.当行缓存满的时候刷新缓冲区,如果多于1024个字符,再次被放入缓冲区中

                5.3        全缓存刷新机制

                                1.程序结束会刷新缓冲区

                                2.遇到fclose(fp)会刷新缓冲区

                                3.输出和输入切换的时候也会刷新缓冲区

                                4.fflush(fp)也会刷新缓冲区

                                5.缓冲区满也会刷新缓冲区(4096)

                5.4        主动刷新缓冲区

                                

int fflush(FILE *stream);

功能:主动刷新缓冲区

参数:
   @stream:文件指针

返回值:成功返回0,失败返回EOF并置位错误码

今天的文章io进程测试题_buffer io error on dev分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87577.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注