标准IO

1、打开流:

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

参数:filename文件名、mode文件访问模式。

mode模式:
"r":打开一个用于读取的文件。该文件必须存在。
"w":创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
"a":追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
"r+" :打开一个用于更新的文件,可读取也可写入。该文件必须存在。
"w+":创建一个用于读写的空文件。
"a+" :打开一个用于读取和追加的文件。

返回:成功返回FILE指针,失败返回NULL指针以及设置errno。

 

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

int main()
{
    FILE *fp;
    fp = fopen("tmp", "r");
    if (fp == NULL) {
        fprintf(stderr,"fopen() faild! errno = %d\n", errno);
        perror("fopen");
        printf("%s\n", strerror(errno));
        exit(1);
    }
    return 0;
}

 

2、关闭流:

fclose函数:int fclose(FILE *stream)

返回值:成功返回0;失败返回EOF。

 

3、读一个字符:

fgetc函数:int fgetc(FILE *stream)  从流获取一个字符。

返回值:成功则以无符号char强制转换为int的形式返回读取的字符;如果到达文件末尾或发生读错误,则返回EOF。

 

4、写入一个字符:

fputc函数:int fputc(int char, FILE *stream)  把字符写入到指定的流中。

参数:char是要被写入的字符,该字符以其对应的int值进行传递

返回值:成功则返回被写入的字符,错误则返回EOF,并设置错误标识符。

 

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

int main(int argc,char **argv)
{
    if (argc < 3) {
        fprintf(stderr, "Usage:%s <src_file_name> <dest_file_name>\n", argv[0]);
        exit(1);
    }
    FILE *fps,*fpd;
    fps = fopen(argv[1], "r");
    if (fps ==  NULL) {
        perror("fopen()");
        exit(1);
    }

    fpd = fopen(argv[2], "w");
    if (fpd == NULL) {
        fclose(fps);
        perror("fopen()");
        exit(1);
    }

    int res = 0;
    while (1) {
        res = fgetc(fps);
        if (res == EOF) {
            break;
        }
        fputc(res,fpd);
    }

    fclose(fps);
    fclose(fpd);
    return 0;
}
 
5、缓冲区输入:
fgets函数:char *fgets(char *str, int n, FILE *stream)
参数:存储缓冲区str字符数组;n最大字符数,读取n-1个字符,后面一个为’\n’;
返回值:成功则返回相同的str参数,失败则返回空指针。
 
6、缓冲区输出:
fwrite函数:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
参数:ptr源缓冲区指针;size为每个块的大小,单位字节;nmemb为块的个数;写出流
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define SIZE 1024

int main(int argc, const char *argv[])
{
    FILE *fps, *fpd;
    fps = fopen("./tmp","r");
    if (fps == NULL) {
        strerror(errno);
        exit(1);
    }

    fpd = fopen("./copy","w");
    if (fpd == NULL) {
        fclose(fps);
        strerror(errno);
        exit(1);
    }

    char buf[SIZE];
    int n = 0;
    while ((n = fread(buf, 1, SIZE, fps)) > 0) {
        printf("%d\n", n);
        fwrite(buf, 1, n, fpd);
    }
    fclose(fps);
    fclose(fpd);
    return 0;
}
 
7、定位流:
fseek函数:int fseek(FILE *stream, long int offset, int whence)
参数:offset是相对whence的偏移量,以字节为单位;whence表示开始添加偏移offset的位置,一般指定为以下常量:
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾
 
ftell函数:long int ftell(FILE *stream)
返回值:该函数返回位置标识符的当前值。如果发生错误,返回-1,全局变量errno被设置为一个正值。
 
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc,char **argv)
{
    if (argc < 2) {
        fprintf(stderr, "Usage:%s <src_file_name> <dest_file_name>\n", argv[0]);
        exit(1);
    }
    FILE *fp;
    fp = fopen(argv[1], "r");
    if (fp ==  NULL) {
        perror("fopen()");
        exit(1);
    }

    fseek(fp, 0, SEEK_END);
    printf("%d\n", ftell(fp));

    fclose(fp);
    return 0;
}
 
9、刷新流:
fflush函数:int fflush(FILE *stream)
 
8、缓冲区的作用:
标准I/O提供缓冲区的目的是尽可能减少使用read和write调用的次数,合并系统调用:
行缓冲:在输入和输出中遇到换行符时,标准I/O库执行I/O操作。换行的时候刷新,满了的时候刷新,强制刷新(标准输出是这样的,因为是终端设备)
全缓冲:填满标准I/O缓存后才进行实际I/O操作。在标准I/O库方面,刷新意味着将缓存中的内容写到磁盘上。满了的时候刷新,强制刷新(默认,只要不是终端设备)
无缓冲:标准出错流stderr通常是不带缓存的。
posted @ 2021-12-03 18:01  bwinLv  阅读(70)  评论(0)    收藏  举报