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;
    }
    
  • 相关阅读:
    图书管理系统---基于form组件和modelform改造添加和编辑
    Keepalived和Heartbeat
    SCAN IP 解释
    Configure Active DataGuard and DG BROKER
    Oracle 11gR2
    我在管理工作中積累的九種最重要的領導力 (李開復)
    公募基金公司超融合基础架构与同城灾备建设实践
    Oracle 11g RAC for LINUX rhel 6.X silent install(静默安装)
    11gR2 静默安装RAC 集群和数据库软件
    Setting Up Oracle GoldenGate 12
  • 原文地址:https://www.cnblogs.com/cfans1993/p/5601991.html
Copyright © 2011-2022 走看看