美文网首页程序员
linux 标准io笔记

linux 标准io笔记

作者: 陈伟志 | 来源:发表于2016-06-20 22:01 被阅读0次

三种缓冲

1.全缓冲:在缓冲区写满时输出到指定的输出端. 比如对磁盘上的文件进行读写通常是全缓冲的.
2.行缓冲:在遇到'\n'时输出到指定的输出端. 比如标准输入和标准输出就是行缓冲, 回车后就会进行相应的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会在行尾插入添加一个'\n', 所以当我们用puts打印文件时,每行显示时都有两个'\n'(除最后一行外), 也就是每行内容下面都会有一个空行

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);
    }
}

每次读写一个对象

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

  • 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\n",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\n",tmpnam(NULL));
 
    char name[L_tmpnam];
    tmpnam(name);
    printf("name: %s\n",name);
 
    char buf[1024];
    FILE *fp;
    if((fp=tmpfile()) == NULL){
        printf("tmpfile error");
        exit(1);
    }
    fputs("one line\n",fp);
    rewind(fp);
    fgets(buf,1024,fp);
    printf("%s",buf);
    return 0;

}

相关文章

  • linux 标准io笔记

    三种缓冲 1.全缓冲:在缓冲区写满时输出到指定的输出端. 比如对磁盘上的文件进行读写通常是全缓冲的.2.行缓冲:在...

  • Linux 文件IO 和 标准IO

    [TOC] Linux 文件IO 和 标准IO Linux 文件IO Linux中做文件IO最常用到的5个函数是:...

  • Linux编程学习笔记 | Linux IO学习[2] - 标准

    在上一篇Linux编程学习笔记 | Linux IO学习[1] - 文件IO中,我总结了Linux下的文件IO。文...

  • 11.标准IO库

    标准IO和文件IO有什么区别 看起来使用时都是函数,但是:标准IO是C库函数,而文件IO是linux系统的API ...

  • 软件架构设计-操作系统

    操作系统 直接IO与缓冲IO 缓冲io又称作标准I/O,大多数文件系统的默认IO操作都是缓冲IO。在linux的缓...

  • 常用Unix API

    备用待查IO 文件io 标准io 参考链接:《C++ Primer》第五版中文版学习笔记

  • linux的零拷贝技术

    在介绍零拷贝技术之前,不得不提的是linux中标准的IO操作存在的问题。linux中的IO操作(主要是read和w...

  • linux I/O5中模型认识

    linux I/O5中模型 引入I/O模型 标准I/O: 缓存 IO 又被称作标准 IO,大多数文件系统的默认 I...

  • Typora--markdown

    https://typora.io/#linux[https://typora.io/#linux]

  • linux高级环境编程-标准IO

    标准IO也是带缓存的IO,它们的操作是围绕流进行,而之前的不带缓存IO操作是围绕文件描述符的,标准IO还是基于文件...

网友评论

    本文标题:linux 标准io笔记

    本文链接:https://www.haomeiwen.com/subject/dtawdttx.html