zoukankan      html  css  js  c++  java
  • C-fopen,fwrite,fread,fseek,fgets,popen,access笔记

    FILE * fopen(const char * path,const char * mode);

    返回值

    • FILE是C语言定义的标准数据结构,如果open()失败,则返回NULL

    path

    • 路径

    mode

    • 打开模式,包括有以下几种
    • r      以只读方式打开文件,该文件必须存在。
    • r+    以读/写方式打开文件,该文件必须存在。
    • rb+  以读/写方式打开一个二进制文件,只允许读/写数据。
    • rt+   以读/写方式打开一个文本文件,允许读和写。
    •     打开只写文件,若文件存在则长度清为 0,即该文件内容消失,若不存在则创建该文件。
    • w+   打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
    •     以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF 符保留)。
    • a+   以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的 EOF 符不保留)。
    • wb   以只写方式打开或新建一个二进制文件,只允许写数据。
    • wb+ 以读/写方式打开或建立一个二进制文件,允许读和写。
    • wt+  以读/写方式打开或建立一个文本文件,允许读写。
    • at+  以读/写方式打开一个文本文件,允许读或在文本末追加数据。
    • ab+ 以读/写方式打开一个二进制文件,允许读或在文件末追加数据。

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

    返回值

    • fread()和fwrite()返回的是成功读取/写入的条目数(也就是nmemb大小),如果到达文件末尾或读写错误,则返回0

    ptr

    • 指针pointer,用来读出或写入的数据区

    size

    • 单个数据项的大小,单位为字节

    nmemb

    • 读写的条目数(实际等于读写字节大小 )

    PS:尽量将size大小写为最小值(1字节)

    int fprintf(FILE *stream, const char *format, ...)

    • 将内容输出到文件中,比如:fprintf(fp, "%s %s %s %d", "We", "are", "in", 2014);,此时的文件中便有了: We are in 2014

    int fclose(FILE *stream);

    • 关闭流 stream,刷新缓冲区,更新文件

    示例1:

    #include<string.h>
    #include<stdio.h>
    
    int main(void)
    {
    FILE *fp = NULL;
    const char *buf = "0123456789";
    fp = fopen("DUMMY.FIL","w");/*创建一个包含10个字节的文件*/
    fwrite(buf,strlen(buf),1,fp);/*将buf内容写入到文件中*/
    fclose(fp);/*关闭文件*/return 0;
    }

     

    int fseek(FILE *stream, long offset, int fromwhere);

    返回值

    • 成功,返回0,失败返回-1,并设置error的值

    offset

    • 偏移量,正数表示正向偏移,负数表示负向偏移,单位为字节

    Fromwhere

    • 偏移起始位置,有3种位置:
    • SEEK_SET(0): 文件开头
    • SEEK_CUR(1): 当前位置
    • SEEK_END(2): 文件结尾

    示例2-读写十六进制:

    #include <stdio.h>                                                                            
    #include <stdlib.h>                                                                           
    #include <string.h>              
    
     
    
    int main(int argc,char* argv[])
    {
           FILE *fp = NULL;
           int readbuf;
           int readEnd;
           int writebuf=100;
           int len;
    
           fp = fopen("./1.txt","rb+");
           printf("read  1.txt:    fp==NULL=%d  size=%d
    ",fp == NULL,sizeof(readbuf));
    
           if(fp!=NULL)          //打开成功,读数据
           {
                  len=fread(&readbuf,sizeof(int),1,fp);      //读写开头的第一个int型数据
    
                  printf("read len=%d  data=%d
    ",len,readbuf);
    
                  fseek(fp,-sizeof(int),SEEK_END);          //将fp指向文件末尾的最后一个int型数据处
    
                  fread(&readEnd,sizeof(int),1,fp);          
    
                  printf("read file end =%d
    ",readEnd);
    
                  fclose(fp);
    
           }
           else                      //打开失败,则创建文件
           {
                  fp = fopen("./1.txt","wb+");
    
                  printf("write  1.txt:    fp==NULL=%d  size=%d
    ",fp == NULL,sizeof(readbuf));
    
                  if(fp!=NULL)
                  {
                     len=fwrite(&writebuf,sizeof(int),1,fp);   //写入一个int型数据
                     printf("write len=%d  
    ",len);
                     fclose(fp);
                  }
           }
           return 0;
    }
    
     

    运行第一次:

     

    运行第二次

     

    示例3-读写某个文件的十六进制以及对应字符串

    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc,char* argv[])
    {
           FILE *fp = NULL;
           unsigned char buf[100];
           int seek;
           int len=10;
           int readl=0;
           char s[20]="./";
    
           strcat(s,argv[1]);
           printf("file:%s
    ",s);           //打印要访问当前目录下的哪个文件
               seek=strtoul(argv[2],0,0);
           len=strtoul(argv[3],0,0);
           fp = fopen(s,"rb+");
    
           if(fp!=NULL)          //打开成功,读数据
           {
    
            printf("input seek=%d   len=%d 
    ",seek,len);  //打印,从文件哪个字节位置处,读多少个字节
    
            fseek(fp,seek,0);
    
            readl=fread(&buf,1,len,fp);
            printf("read len=%d
    ",readl);          //打印实际读出的字节长度
    
            for(int i=0;i<=(readl/10);i++)
            {
                    for(int j=0;j<10;j++)
                    {
                      if((i*10+j)>=readl)
                       printf("    ");  
               else
                      printf("%d ",buf[i*10+j]);            //打印读出的16进制数据
                    }
    
                    printf("       ||");
    
    
                     for(int j=0;j<10;j++)
                    {
                      if((i*10+j)>=readl)
                             break;
    
                      printf("%c",buf[i*10+j]);             //打印16进制数据对应的字符串
                    }
    
                    printf("
    ");
            }
           fclose(fp);
           }
          return 0;
    }

    以访问test.txt文件为例,它的内容如下:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    17 18 19 20 21 22 23 24 25 26 27 28 29

    运行示例:

    char *fgets(char *buf, int bufsize, FILE *stream);

    文件结构体指针stream中读取数据,每次读取一行。

    读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋''),如果文件中的该行,不足bufsize-1个字符,则读完该行就结束。

    如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行

    返回值

    • 如果为NULL,表示读到文件结尾或者出错,否则返回读成功的缓存区地址

    bufsize

    • 如果n=1,会返回空串

    示例-打印文件全部数据:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc,char* argv[])
    {
            FILE *fp = NULL;
            char readbuf[5];
            fp = fopen("./1.txt","r+");
    
            printf("(DEBUG)read  1.txt:    fp==NULL=%d
    ",fp == NULL);
            if(fp!=NULL)            //打开成功,读数据
            {
                    while(fgets(readbuf, sizeof(readbuf),fp))
                    {
                            printf("%s",readbuf);
                    }
                    fclose(fp);
            }
            return 0;
    }

     

    FILE *popen(const char *command, const char *type);

    int pclose(FILE *stream);

    头文件#include <stdio.h>

    • 若popen ()的type是”r”,则文件指针是连接到子进程执行command命令的标准输出。
    • 若popen ()的type是”w”,则文件指针连接到子进程执行command命令的标准输入。

    示例

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int run_command(const char *cmd, const char *type)
    {
            FILE *fp;
            int res; char buf[1024];
    if ((fp = popen(cmd, type)) ==NULL) { printf("popen err "); return -1; } if(type[0]=='r') //如果是读数据 { while(fgets(buf, sizeof(buf),fp)) { printf("%s",buf); } } pclose(fp); return 0; } int main(int argc,char* argv[]) { run_command("vi 1.txt","r"); return 0; }

    效果:

    int access(const char *pathname, int mode);

    头文件:#include <unistd.h>

    用来检测访问的文件属性,是否可以读写,存在,执行

    mode

    模式有以下几种:

    #define  F_OK      0     /* Check for file existence */
    #define  X_OK      1     /* Check for execute permission. */
    #define  W_OK     2     /* Check for write permission */
    #define  R_OK      4     /* Check for read permission */

    示例-检测文件是否存在

    #include <stdio.h>
    #include <unistd.h>
    int file_exists(char *filename);
    
    int main(void)
    {
            printf("Does NOTEXIST.FIL exist: %s
    ",
            file_exists("./1.txt") ? "YES" : "NO");
            return 0;
    }
    
    int file_exists(char *filename)
    {
               return (access(filename, 0) == 0);
    }

    如果在嵌入式linux中,则有可能在写数据后强制关电,此时数据还在缓冲区,并没写到flash中,所以需要在fclose()前面加上:

    fflush(fp);                 //会把缓冲区中的文件写到文件系统中
    fsync(fileno(fp));          //同步数据到flash
    fclose(fp);     

          

  • 相关阅读:
    漫谈AOP开发之初探AOP及AspectJ的用法
    Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
    深入理解Java虚拟机:OutOfMemory实战
    Java内存泄漏分析与解决方案
    漂亮回答面试官struts2的原理
    [小知识]不显示没有内容的UITableViewCell
    initWithCoder: 与initWithFrame:
    pageControl设置不居中显示,居左或居右
    Xcode中报错或警告信息整理,持续更新...
    [小技巧]阀值的使用
  • 原文地址:https://www.cnblogs.com/lifexy/p/9451158.html
Copyright © 2011-2022 走看看