zoukankan      html  css  js  c++  java
  • linux 标准io笔记

    三种缓冲

    1.全缓冲:在缓冲区写满时输出到指定的输出端. 比如对磁盘上的文件进行读写通常是全缓冲的.
    2.行缓冲:在遇到' '时输出到指定的输出端. 比如标准输入和标准输出就是行缓冲, 回车后就会进行相应的I/O操作.
    3.无缓冲:有什么就输出什么. 比如标准错误输出, 出错时立即显示出来.
    设置缓冲方式的函数有两个,分别为setbuf,setvbuf
    可用fflush立即输出,不管缓冲区是否达到输出标准

    打开、关闭

    1.FILE *fopen(const char *restrict pathname, const char *restrict type)
    第一个参数为文件的路径,
    第二个参数为打开的方式: r/rb只读; w/wb只写; a/ab添加; r+/ra+读写; w+/wa+读写; a+/ab+文件尾添加读写

    2.int fclose(FILE *fp)
    关闭打开的文件流, 释放内存

    读写终止判断

    读写终止分两种情况, 读写到文件尾正常终止, 读写出错返回
    int feof(FILE *fp): 如果是正常终止, 函数返回非0(true)值
    int ferror(FILE *fp): 如果是出错终止, 函数返回非0(true)值

    每次读写一个字符

    getc/fgetc/getchar
    putc/fputc/putchar
    getchar和putchar对应终端窗口的输入输出, 不用指定参数
    getc和fgetc需要指定FILE *fp

    void onechar(FILE *fp){
        int ch;
        while((ch=getc(fp)) != EOF){
            if(putchar(ch) == EOF){
                printf("output error");
                exit(1);
            }
        }
        if(ferror(fp)){
            printf("file read error");
            exit(1);
        }
    }
    

    每次读写一行

    fgets/gets
    fputs/puts
    gets/puts默认对应终端窗口的输入输出

    注意: puts会在行尾插入添加一个' ', 所以当我们用puts打印文件时,每行显示时都有两个' '(除最后一行外), 也就是每行内容下面都会有一个空行

    void  oneline(FILE *fp){
        char buf[1024];
        while(fgets(buf,MAXLINE,fp) != NULL){
            if(puts(buf) == EOF){
                printf("output error");
                exit(1);
            }
        }
        if(ferror(fp)){
            printf("read error");
            exit(1);
        }
    }
    

    每次读写一个对象

    这种读写方式也称为二进制方式, 由我们自己设定一次读几个字节

    • size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp)
      参数含义:从fp读取, 读取的内容写到ptr指向的内存, 每次读取size个字符, 一共读nobj次, 返回值为实际读取的次数
    • size_t fwrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp)
    struct people{
        char name[10];
        int age;
    };
     
    void readstruct(){
        struct people man;
        FILE *fp;
        if((fp=fopen("./test.txt","r")) == NULL){
            printf("fopen error");
            exit(1);
        }
        if(fread(&man,sizeof(struct people),1,fp) != 1){
            printf("fread error");
            exit(1);  
        }
        printf("name=%s, age=%d
    ",man.name,man.age);
        fclose(fp);
    }
     
    void writestruct(){
        struct people man;
        int i;
        sprintf(man.name,"charlotte");
        man.age=20;
        FILE *fp;
        if((fp=fopen("./test.txt","w+")) == NULL){
            printf("fopen error");
            exit(1);
        }
        if(fwrite(&man,sizeof(struct people),1,fp) != 1){
            printf("fwrite error");
            exit(1);
        }
        fclose(fp);
    }
    

    跳转

    创建一个文件, 然后写入一些内容, 这时文件指针在文件尾,
    如果想用这个文件指针读取刚刚写入的内容, 就需要先将文件指针移动文件头部
    void rewind(FILE *fp)

    将文件指针移动文件头

    void fseek(FILE*fp, long offset, int whence)

    随意移动到哪里
    whence为初步移动: SEEK_SET 移到文件头; SEEK_END 移到文件尾; SEEK_CUR 移到当前位置(不动)
    offset为精调:确定了whence之后, 再移动offset个位置

    临时文件

    临时文件的两个特殊需求:1.文件名要唯一 2.不需要时最好能自己删除
    char *tmpnam(char *ptr):

    产生唯一的"路径/文件名"形式的字符串,传入的参数可以为NULL,或者长度不小于L_tmpnam的字符数组

    FILE *tmpfile()

    自动生成文件名并创建临时文件, 临时文件在关闭或程序退出时自动删除

    如果是一次性读写可以直接调用tmpfile, 如果需要重复读写可以用tmpnam生成文件名然后手动创建和删除文件

    int main(){
        printf("just test: %s
    ",tmpnam(NULL));
     
        char name[L_tmpnam];
        tmpnam(name);
        printf("name: %s
    ",name);
     
        char buf[1024];
        FILE *fp;
        if((fp=tmpfile()) == NULL){
            printf("tmpfile error");
            exit(1);
        }
        fputs("one line
    ",fp);
        rewind(fp);
        fgets(buf,1024,fp);
        printf("%s",buf);
        return 0;
    }
    
  • 相关阅读:
    重测序(RADseq)做群体遗传分析套路
    BSA分析
    GWAS初探
    GWAS在农业上应用
    【Python小试】计算目录下所有DNA序列的Kmer并过滤
    dict['source'] = list[1],出现这种情况大多是数据的格式发生错误
    First Wainberg-2018-Deep learning in biomedicine Experience
    Second LearningConvolutionalNeuralNetworksforGraphs Experience
    从windows本地IDE启动远程Linux文件进行调试
    xshell的一些基本操作
  • 原文地址:https://www.cnblogs.com/cfans1993/p/5601991.html
Copyright © 2011-2022 走看看