美文网首页
linux高级环境编程-标准IO

linux高级环境编程-标准IO

作者: lifesmily | 来源:发表于2017-06-25 19:59 被阅读21次

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

image.png

预读
http://hongyilinux.blog.51cto.com/8030513/1746199
https://segmentfault.com/a/1190000008228426
http://www.yeolar.com/note/2012/05/16/linux-advanced-io/

常用函数API

FILE *fopen(const char *path, const char *mode)
int fclose(FILE *fp)
int fgetc(FILE *stream)
int fputc(int c, FILE *stream)
char *fgets(char *s, int size, FILE *stream)
int fputs(const char *s, FILE *stream)
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

程序示例:

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE *fp;

    fp = fopen("stdio.log", "w+");
    if (fp == NULL) {
        printf("File create fail...\n");
        return -1; 
    } else {
        printf("File create success...\n");
    }
    
    /* fwrite() function */ 
    char buffer_1[] = "This is fwrite DEMO..."; 
    size_t wr_size = 0; 
    wr_size = fwrite(buffer_1, 1, sizeof(buffer_1), fp); 
    printf("wr_size = %d\n", wr_size); 

    /* fputs() function */ 
    char buffer_2[] = "\nThis is fputs DEMO...\n"; 
    int fputs_status = 0; 
    fputs_status = fputs(buffer_2, fp); 
    printf("fputs_status = %d\n", wr_size); 
    
    /* puts function */
    char buffer_3[] = "This is puts DEMO..."; 
    puts(buffer_3);

    /* fputc function */
    char buffer_4[] = "This is fputc DEMO...\n";
    int ret;
    for (int i = 0; i < sizeof(buffer_4); i++) {
        ret = fputc(buffer_4[i], fp);
        printf("%c", ret);
    }

    /* putc function */
    char buffer_5[] = "This is putc DEMO...\n";
    for (int i = 0; i < sizeof(buffer_5); i++) {
        ret = fputc(buffer_5[i], fp);
        printf("%c", ret);
    }    
    fclose(fp);   
    return 0; 
}
进一步分析:

IO操作可以分为非格式IO和格式IO,非格式化IO有以下三种,

image.png
  • 每次读一行IO
image.png

buf为缓冲区地址,gets表示从标准输入读,而fgets从指定的流读,fgets必须指定缓冲区长度n,最后一个为null,能读入n-1个字符,若一行长度大于n,则返回一个不完整的行。gets没有指定缓冲区长度会导致可能的溢出,一般弃用。

image.png

fputs将一个以null字节终止的字符串写道指定的流,不一定每次一行,要看有没有换行符,和上面的读fgets对应。
puts将一个null字节终止的字符串写到标准输出,同时会写入一个换行符。put尽量不使用。

  • 二进制IO
    二进制IO操作,需要一次读或写整个结构,如果通过调用 fputs 和 fgets 实现,由于二进制IO过程中可能会提供 null 字节而不能正确工作,提供以下函数。
    image.png

一般有以下两种常见用法,读写一个数组和读一个结构。

#include <stdio.h>
  
int main ()
{
    FILE *fp = fopen ("output.txt", "w");
    float data[10] = {0, 12, 1.414, 3.562, 43213, 4214};
    if (fwrite (data, sizeof(float), 10, fp) != 10)
    {
        perror ("fwrite error: ");
        return -1;
    }
    return 0;
}
#include <stdio.h>
#include <string.h>
 
#define NAMESIZE 1024
  
struct Str_tmp
{
    short count;
    long total;
    char name[NAMESIZE];
};
  
int main ()
{
    struct Str_tmp item;
    scanf ("%s", item.name);
    item.count = strlen (item.name);
    item.total = 1024;  
      
    FILE *fp = fopen ("output.txt", "w");
  
    if (fwrite (&item, sizeof(item), 1, fp) != 1)
    {
        perror ("fwrite error: ");
        return -1;
    }
    return 0;
}
  • 定位流
  • 格式化IO

相关文章

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

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

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

    本文主要理清非阻塞IO,记录锁,IO多路转接,异步IO,readv和writev函数以及存储映射IO。学习 1、同...

  • linux高级环境编程-文件IO

    开始本章学习之前了解一些概念: 1、带缓存和不带缓存IO 参考系统调用,用户程序通过系统级别API调用系统函数将请...

  • Linux高级环境编程

    1. 编译的四个步骤: 预处理gcc -E test.c -o test.i 编译:将高级语言编译成汇编语言gcc...

  • unix环境高级编程-文件i/o

    最近在读unix环境高级编程,每天都会做做笔记! UNIX标准及实现 UNIX编程环境的标准化已经取得了很大进展。...

  • Linux 文件IO 和 标准IO

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

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

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

  • linux高级环境编程--进程

    进程 进程间通信机制 信号 参考 https://www.ibm.com/developerworks/cn/li...

  • linux高级环境编程-线程

    线程 在单进程环境下使用多线程执行多个任务。一个进程的所有线程可以访问该进程的资源。当然也需要涉及处理一致性问题。...

  • Linux环境高级编程基础

    Linux是最受程序员欢迎的操作系统之一。第一它是开源的,第二它的系统调用少,第三它的抽象更到位。一切皆进程,一切...

网友评论

      本文标题:linux高级环境编程-标准IO

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