zoukankan      html  css  js  c++  java
  • LINUX文件格式化读写(文件指针,缓冲)

     基于文件指针的文件操作(缓冲)
    linux的文件和文件描述符
    linux中对目录和设备的操作都是文件操作,文件分为普通文件,目录文件,链接文件和设备文件
    普通文件:也称磁盘文件,并且能够进行随机的数据存储(能够自由seek定位到某一个位置);
    管道:是一个从一端发送数据,另一端接收数据的数据通道;
    目录也称为目录文件,它包含了保存在目录中文件列表的简单文件。
    设备:该类型的文件提供了大多数物理设备的接口。它又分为两种类型:
          字符型设备和块设备:字符型设备一次只能读出和写入一个字节的数据,包括调制解调器、终端、打印机、声卡以及鼠标;块设备必须以一定大小的块来读出或者写入数据,块设备包括CD-ROM、RAM驱动器和磁盘驱动器等,一般而言,字符设备用于传输数据,块设备用于存储数据。
    链接:类似于Windows的快捷方式和Linux里的别名,指包含到达另一个文件路径的文件。
    套接字:在Linux中,套接字也可以当作文件来进行处理。
    基于文件指针的文件操作函数是ANSI标准函数库的一部分。


    1.1. 文件的创建,打开与关闭
    原型为:
    #include <stdio.h>    //头文件包含
    FILE *fopen(const char *path,const char *mode);    //文件名  模式
    int fclose(FILE *stream);

    fopen以mode的方式打开或创建文件,如果成功,将返回一个文件指针,失败则返回NULL.
    fopen创建的文件的访问权限将以 0666 与当前的umask结合来确定。
    mode 的可选模式列表
    模式 位置 截断原内容
    rb Y N 文件头 N N
    rb+ Y Y 文件头 N N
    wb N Y 文件头 Y Y
    wb+ Y Y 文件头 Y Y
    ab N Y 文件尾 N Y
    ab+ Y Y 文件尾 N Y
    (截断原内容指文件打开,里面内容就不见了)
    Linux系统中,mode里面的’b’(二进制)可以去掉,但是为了保持与其他系统的兼容性,建议不要去掉。ab和a+b为追加模式,在此两种模式下,无论文件读写点定位到何处,在写数据时都将是在文件末尾添加,所以比较适合于多进程写同一个文件的情况下保证数据的完整性。
    1.2. 读写文件
    基于文件指针的数据读写函数较多,可分为如下几组:
    数据块读写:
    #include <stdio.h>
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);

    fread从文件流stream 中读取nmemb个元素,写到ptr指向的内存中,每个元素的大小为size个字节。
    fwrite从ptr指向的内存中读取nmemb个元素,写到文件流stream中,每个元素size个字节。

    所有的文件读写函数都从文件的当前读写点开始读写,读写完以后,当前读写点自动往后移动size*nmemb个字节。

    整块copy,速度较快,但是是二进制操作






    格式化读写:
    #include <stdio.h>
    int printf(const char *format, ...);   //相当于fprintf(stdout,format,…);
    int scanf(const char *format, …);
    int fprintf(FILE *stream, const char *format, ...);  重点
    int fscanf(FILE *stream, const char *format, …);
    int sprintf(char *str, const char *format, ...);     
    // eg:  sprintf(buf,”the string is:%s”,str);   重点
    int sscanf(char *str, const char *format, …);  重点
    fprintf将格式化后的字符串写入到文件流stream中
    sprintf将格式化后的字符串写入到字符串str中   
        

    单个字符读写:
    使用下列函数可以一次读写一个字符       
    #include <stdio.h>
    int fgetc(FILE *stream);
    int fputc(int c, FILE *stream);
    int getc(FILE *stream);               → 等同于 fgetc(FILE* stream)
    int putc(int c, FILE *stream);        → 等同于 fputc(int c, FILE* stream)
    int getchar(void);                    → 等同于 fgetc(stdin);
    int putchar(int c);                   → 等同于 fputc(int c, stdout);
    getchar和putchar从标准输入输出流中读写数据,其他函数从文件流stream中读写数据。


    字符串读写:
    char *fgets(char *s, int size, FILE *stream);
    int fputs(const char *s, FILE *stream);
    int puts(const char *s);   → 等同于 fputs(const char *s,stdout);
    char *gets(char *s);       → 等同于 fgets(const char *s, int size, stdin);
    fgets和fputs从文件流stream中读写一行数据;
    puts和gets从标准输入输出流中读写一行数据。

    fgets可以指定目标缓冲区的大小,所以相对于gets安全,但是fgets调用时,如果文件中当前行的字符个数大于size,则下一次fgets调用时,将继续读取该行剩下的字符,fgets读取一行字符时,保留行尾的换行符。


    fputs不会在行尾自动添加换行符,但是puts会在标准输出流中自动添加一换行符。
    文件定位:
    文件定位指读取或设置文件当前读写点,所有的通过文件指针读写数据的函数,都是从文件的当前读写点读写数据的。
    常用的函数有:
    #include <stdio.h>
    int feof(FILE * stream);//通常的用法为while(!feof(fp)),到达文件尾返回一个非0值.
    int fseek(FILE *stream, long offset, int whence);//设置当前读写点到偏移whence 长度为offset处.
    long ftell(FILE *stream); //用来获得文件流当前的读写位置.
    void rewind(FILE *stream);//把文件流的读写位置移至文件开头 → fseek(fp, 0, SEEK_SET).

    feof判断是否到达文件末尾的下一个(注意到达文件末尾之后还会做一次)


    fseek设置当前读写点到偏移whence 长度为offset处,whence可以是:
    SEEK_SET        (文件开头 → 0)
    SEEK_CUR        (文件当前位置 → 1)
    SEEK_END        (文件末尾 → 2)


    ftell获取当前的读写点
    rewind将文件当前读写点移动到文件头


    注:基于文件指针的文件操作请参考《C语言文件操作常用函数详解.doc》



    #include <strings.h>
    void bzero(void *s, size_t n);   //对数组进行初始化,初始全部为0或‘’
    //bzero.c
    #include<stdio.h>
    #include<strings.h>
    int main()
    {
            char buf[128]="hello , world";
            printf("buf=%s ",buf);
            bzero(buf,sizeof(buf));
            printf("buf=%s ",buf);
            return 1;
    }

    查看程序执行的返回值 echo $?
    int sprintf(char *str, const char *format, ...);     
    eg: sprintf(buf, “%s%s” ,”the string is” , “str”);    //重点
    //sprintf.c
    #include<stdio.h>
    int main()
    {
            char buf[128];
            int ret;
            ret=sprintf(buf,"%s %s","hello","world");
            printf("ret=%d  buf=%s ",ret,buf);
            ret=sprintf(buf,"%d %d",1,2);
            printf("ret=%d  buf=%s ",ret,buf);
            return 1;
    }


    字符串拼接,字符串和整形什么的都可以,拼接放到一个新的变量


    int sscanf(const char *str, const char *format, ...);

    //sscanf.c
    #include<stdio.h>
    typedef struct student
    {
            int num ;
            char name[20];
            float score;
    }stu;
    int main()
    {
            stu s;
            char *p="110 meihao 99.99";
            int ret;
            ret=sscanf(p,"%d %s %f",&s.num,(char *)&s.name,&s.score);
            if(3!=ret)
            {
                    perror("sscanf");
                    return -1;
            }
            printf("%d %s %4.2f ",s.num,s.name,s.score);
            return 1;
    }


    Linuxctrl+d 用于结束输入,ctrl+c  中断当前进程





  • 相关阅读:
    使用gunicorn部署flask项目
    加密算法详解
    elasticsearch安装
    elk下载链接
    mysql允许远程连接
    工作流源代码分析
    查看账户的访问token
    Kube-proxy组件
    创建服务账户/查询访问token
    K8s概念2
  • 原文地址:https://www.cnblogs.com/meihao1203/p/8403708.html
Copyright © 2011-2022 走看看