输入\输出函数总结

错误报告函数

strerror

返回错误码errno所对应的错误信息。标准库函数提供了一个全局变量erron(在头文件errno.h中定义),记录错误的信息,提示错误的原因

用法:


    #include<stdio.h>
    #include<limits.h>
    #include<stdlib.h>
    int main()
    {
        int *p = (int *)malloc(INT_MAX);
        if (p == NULL)
        {
            printf("%s\n", strerror(errno));
        }
        free(p);
        p = NULL;
        return 0;
    }

perror

void perror(const char *str)

perror以一种简单、统一的方式报告错误

用法:


    #include<stdio.h>
    #include<limits.h>
    #include<stdlib.h>
    int main()
    {
        int *p = (int *)malloc(INT_MAX);
        if (p == NULL)
        {
            perror("use malloc");
        }
        free(p);
        p = NULL;
        return 0;
    }

终止执行函数

void exit(int status)

exit函数由于终止一个程序,定义在头文件stdlib.h中,EXIT_SUCCESS()和EXIT_FAILURE分别表示成功返回和失败返回,加入在上述的例子中,内存开辟失败自然要进行失败返回


    #include<stdio.h>
    #include<limits.h>
    #include<stdlib.h>
    int main()
    {
        int *p = (int *)malloc(INT_MAX);
        if (p == NULL)
        {
            perror("use malloc");
            exit(EXIT_FAILURE);
        }
        free(p);
        p = NULL;
        return 0;
    }

宏定义的状态值:


    EXIT_SUCCESS  0
    EXIT_FAILURE  1

文件

在stdio中定义了一个FLIE数据结构,用于维护一个流。对于一个标准c程序,编译器默认至少打开是哪个流:每一个流都是指向FILE结构的指针

  • 标准输入流(stdin)
  • 标准输出流(stdout)
  • 标准错误流(stderr)

IO常量

  • EOF–文件结束标志,表示文件到了结尾
  • FOPEN_MAX–一个程序最多打开文件数(20)
  • FTLENAME_MAX–文件名的最大长度(260)

打开流函数

FILE *fopen(const char *filename,const char *mode)

mode:

  • “r”:打开一个已有的文本文件,允许读取文件。
  • “w”:打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
  • “a”:打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
  • “a+”:打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

关闭流函数

int fclose(FILE *stream)

当打开一个流的时候,操作完成主动将流关闭,以便于其他进程使用

IO函数

单个字符操作函数

字符输入函数 getchar 标准输入流
字符输入函数 putchar 标准输出流
字符输入函数 fgetc,getc 所有输入流
字符输出函数 fputc,putc 所有输出流

getchar、putchar


    int ch = 0;
    ch = getchar();//stdin
    putchar(ch);//stdout

fgetc、getc、fputc、putc


    #include<stdio.h>
    #pragma warning(disable:4996)
    int main()
    {
        int ch = 0;
        FILE *pf = fopen("test.txt", "r");
        if (pf == NULL)
        {
            perror("use fopen");
            exit(EXIT_FAILURE);
        }
        //"写操作"--"w"
        fputc('b', pf);
        //"读操作"--"r"
        ch=fgetc(pf);
        putchar(ch);
        fclose(pf);
        pf =NULL;
        return 0;
    }

文本操作函数

文本输入函数 fgets、gets 所有输入流
文本输出函数 fputs、puts 所有输出流

fgets、gets、fputs、puts


    #include<stdio.h>
    #include<stdlib.h>
    #pragma warning(disable:4996)
    int main()
    {
        char arr[10] = { 0 };
        FILE *pf = fopen("test.txt", "r");
        if (pf == NULL)
        {
            perror("use fopen");
            exit(EXIT_FAILURE);
        }
        //"写操作"--"w"
        fputs("hello\n",pf);
        fputs("world\n", pf);
        //"读操作"--"r"
        fgets(arr,10,pf);
        printf("%s", arr);
        fclose(pf);
        pf = NULL;
        return 0;
    }

格式化操作函数

格式化输入函数 scanf 标准输入流
格式化输出函数 printf 标准输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
格式化输入函数 sscanf 所有输入流
格式化输出函数 sprintf 所有输入流

fscanf、fprintf


    #include<stdio.h>
    #include<stdlib.h>
    #pragma warning(disable:4996)
    int main()
    {
        char arr[10] = { 0 };
        int n = 0;
        char ch = 0;
        FILE *pf = fopen("test.txt", "r");
        if (pf == NULL)
        {
            perror("use fopen");
            exit(EXIT_FAILURE);
        }
        //"写操作"--"w",从标准输出流中读入,在写到pf维护的流中
        fscanf(stdin, "%s %d %c", arr, &n, &ch);
        fprintf(pf, "%s %d %c", arr, n, ch);
        //"读操作"--"r",从pf维护的流读出来,写到标准输出流中
        fscanf(pf, "%s %d %c", arr, &n, &ch);
        fprintf(stdout, "%s %d %c", arr, n, ch);
        fclose(pf);
        pf = NULL;
        return 0;
    }

sprintf、sscanf


    #include<stdio.h>
    #include<stdlib.h>
    #pragma warning(disable:4996)
    struct S
    {
        char name[20];
        int age;
        float width;
    };
    int main()
    {
        struct S stu = { "zhangsan", 20, 290.0f };
        struct S tmp;
        char buf[100] = { 0 };
        //sprintf是将一些数据按照格式化写到一个字符串中
        sprintf(buf, "%s %d %f", stu.name, stu.age, stu.width);
        //sscanf是从一个字符串中格式化读出来数据
        sscanf(buf, "%s %d %f", tmp.name, &tmp.age, &tmp.width);
        return 0;
    }

二进制操作函数

二进制输入 fread 文件
二进制输出 fwrite 文件


    #include<stdio.h>
    #include<stdlib.h>
    #pragma warning(disable:4996)
    struct S
    {
        char name[20];
        int age;
        float width;
    };
    int main()
    {
        struct S stu = { "zhangsan", 20, 290.0f };
        FILE *pf = fopen("test.txt", "r");
        if (pf == NULL)
        {
            perror("use fopen");
        }
        //"写一个二进制的文件"--"w"
        fwrite(&stu, sizeof(struct S), 1, pf);
        //"读一个二进制的文件"--"r"
        fread(&stu, sizeof(struct S), 1,pf);
        printf("%s %d %f", stu.name, stu.age, stu.width);
        fclose(pf);
        return 0;
    }

其他常见函数

  • fflush

刷新缓冲区

  • ftell

用于得到文件位置指针当前位置相对于文件首的偏移字节数

  • fseek

    int fseek(FILE *stream, long offset, int fromwhere);

    函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset取值大于等于2 * 1024 * 1024 * 1024,即long的正数范围2G),则不改变stream指向的位置,函数返回一个非0值

  • setbuf

void setbuf(FILE *steam, char *buf);

把缓冲区与流相联

  • setvbuf

int setvbuf(FILE *stream, char *buf, int type, unsigned size);

参数:stream :指向流的指针
buf:期望缓冲区的地址
type:期望缓冲区的类型
_IOFBF(满缓冲:当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数据。
_IOLBF(行缓冲:每次从流中读入一行数据或向流中写入一行数据。
_IONBF(无缓冲:直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
size:缓冲区内字节的数量。
功 能: 把缓冲区与流相关

  • fgetpos

int fgetpos(FILE * restrict stream,fpos_t * restrict pos);

在pos所指的位置放置一个fpos_t值,这个值描述了文件中的一个位置。返回值:如果成功,函数返回0;否则返回一个非零值。

  • fsetpos

int fsetpos(FILE *stream, const fpos_t *pos);

将文件指针定位在pos指定的位置上。该函数的功能与前面提到的fgetpos相反,是将文件指针fp按照pos指定的位置在文件中定位。pos值以内部格式存储,仅由fgetpos和fsetpos使用。

  • rewind

将文件内部的指针重新指向一个流的开头

  • feof

int feof(FILE *stream);

检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除。

  • ferror

int ferror(FILE *stream);

ferror,函数名,在调用各种输入输出函数(如 putc.getc.fread.fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。 它的一般调用形式为 ferror(fp);如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。应该注意,对同一个文件 每一次调用输入输出函数,均产生一个新的ferror函 数值,因此,应当在调用一个输入输出函数后立即检 查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。

  • clearerr

void clearerr(FILE *stream);

clearerr的作用是使文件错误标志和文件结束标志置为0.假设在调用一个输入输出函数时出现了错误,ferror函数值为一个非零值。在调用clearerr(fp)后,ferror(fp)的值变为0。

  • tmpfile

tmpfile是一种函数,功能是以wb+形式创建一个临时二进制文件

  • remove

删除一个文件

  • rename

文件重命名

猜你喜欢

转载自blog.csdn.net/hansionz/article/details/80884217