Linux系统下使用标准C库的文件管理操作

本文详细介绍了C语言中文件操作的基础知识,包括fopen、fclose、fread、fwrite和fseek等函数的使用方法,解释了这些函数的功能、参数含义及返回值,同时提供了丰富的示例代码帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fopen  fwrite  fread  fclose ... 属于标准 C

include <stdio.h> standard io lib

open  close  write  read ... 属于Linux系统调用

可移植性与缓存 fopen 强过于 open ... 
                             fopen用户态有缓存,而open用户态无缓存...
运行图示

 

1、fopen()

函数原型:FILE * fopen(constchar *path , cost char *mode)

/*
* @description : 打开一个文件
* @param ‐ path : 指定文件路径 , 如: "./test.txt"
* @param ‐ mode :指定文件的打开方式,如下图:
* @return : 成功,返回指向该文件的文件指针 ; 若失败,返回 NULL
*/
参数说明 :第一个参数为欲打开文件的文件路径及文件名 eg:"mm",第二个参数表示对文件的打开方式 eg "r" 或  "w" 或  "r+"...
注:mode有以下值
r: 只读方式打开,文件必须存在
r+ :可读写,文件必须存在
rb+ :打开二进制文件,可以读写
rt+: 打开文本文件,可读写
w: 只写,文件存在则文件长度清 0 ,文件不存在则建立该文件
w+ : 可读写,文件存在则文件长度清 0 ,文件不存在则建立该文件
a: 附加方式打开只写,不存在建立该文件,存在写入的数据加到文件尾, EOF 符保留
a+ :附加方式打开可读写,不存在建立该文件,存在写入的数据加到文件尾, EOF 符不保留
wb :打开二进制文件,只写 wb+: 打开或建立二进制文件,可读写
wt+: 打开或建立文本文件,可读写
at+: 打开文本文件,可读写,写的数据加在文本末尾 ab+: 打开二进制文件,可读写,写的数据加在文件末尾
常用的有:r  r+  w  w+ ( 切记 :有关 "r" 的mode必要要求文件存在才可以操作)

2、fclose()

函数原型int  fclose(FILE* stream);

@return : 成功,返回0; 若失败,返回EOF

fclose与fopen联合代码

#include <stdio.h>
#include <string.h>
int main(){

    FILE *flag=NULL;
    int ntd;  

    flag=fopen("/home/lhy/fmm","w");//打开文件fww ,若文件不存在,则创立
    if(flag==NULL){
       printf("open failed!\n");
       return -1;
    
    }
    printf("open sussend!\n");

    ntd=fclose(flag);
    if(ntd){ 
       printf("close failed!\n");
      return -1; 
    }
    printf("close sussend=%d!\n",ntd);//关闭成功,返回成功的值为0;

   return 0;
}

3、fread()

函数原型 :size_t fread(void* buff , size_t  size, size_t  count , FILE* stream)
参数:
@第一个参数为接收数据的指针 (buffff), 也即数据存储的地址;
@第二个参数为单个元素的大小,即由指针写入地址的数据大小,注意单位是字节;
@第三个参数为元素个数,即要读取多少个数据大小为 size 的元素的个数;
@第四个参数为提供数据的文件指针,该指针指向文件内部数据;
返回值:读取的总数据元素个数;
#include <stdio.h>
#include <string.h>
int main(){

    FILE *flag=NULL;
    int ntd;  
    char readbuff[12];char readbuff[12]={0};
    memset(readbuff,0,12);//初始化数组整体为0   

    flag=fopen("/home/lhy/fmm","r+");//上一个代码已经w创立了,于是这里便r+直接读写就行了
    if(flag==NULL){
       printf("open failed!\n");
       return -1;
    
    }
    printf("open sussend!\n");


   ntd=fread(&readbuff,4,2,flag);//size为4,表示4个字节,count为2表示2个size,于是一共8字节
   if(ntd<=0){
    printf("read failed!\n");
 
  }  
  printf("have readed = %s\n",readbuff);//读取fmm文件的内容,存在入readbuff数组,再打印出来



   ntd=fclose(flag);
    if(ntd){ 
       printf("close failed!\n");
      return -1; 
    }
    printf("close sussend=%d!\n",ntd);//关闭成功,返回成功的值为0;

   return 0;
}

4、fwrite()

函数原型:int fwrite(void* bufferint sizeint countFILE* fp);

@参数类型与功能同上fread();

@return : 返回实际写入的数据项的个数

fwrite与fread归纳:

       fread() ── fp 所指向文件的当前位置开始,一次读入 size 个字节,重复 count 次,并将读入的数据存放, 到从 buffffer 开始的内存中; buffffer 是存放读入数据的起始地址(即存放何处)eg:&readbuff表示起始。
        fwrite() ── buffffer 开始,一次输出 size 个字节,重复 count 次,并将输出的数据存放到 fp 所指向的文件中。 buffffer是要输出数据在 内存中的起始地址(即从何处开始输出)eg:&writebuff表示起始。
#include <stdio.h>
#include <string.h>


//FILE *fopen(const char *pathname, const char *mode);
//int fclose(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);
//int fseek(FILE *stream, long offset, int whence);


int main()
{
    int i,j;
    FILE *flag=NULL;
    int ntd;
    char readbuff[12];//char readbuff[12]={0};用这个就可以不用memset()
    char *writebuff="hello world";
    memset(readbuff,0,12);

  
    flag=fopen("/home/lhy/fmm","r+");
    if(flag==NULL){
       printf("open failed!\n");
       return -1;
    
    }
    printf("open sussend!\n");



   ntd=fread(&readbuff,4,2,flag);
   if(ntd<=0){
    printf("read failed!\n");
 
  }  
    printf("have readed = %s\n",readbuff);
  


   ntd=fwrite(writebuff,4,1,flag);//failed is open() not use "r+"
  if(ntd<=0){
     printf("write failed\n");
     return -1;
  }
  printf("have writed %d\n",ntd);//返回1,这里的返回值为count参数



    ntd=fclose(flag);
    if(ntd){ 
       printf("close failed!\n");
      return -1; 
    }
    printf("close sussend=%d!\n",ntd);//关闭成功返回0

   return 0;
}


5、fseek()

函数类型int fseek(FILE *stream,long offset,int framewhere);

参数:
@第一个为文件指针,
@第二个是指针的偏移量,
@第三个是指针偏移起始位置
@返回值:重定位成功返回 0 ,否则返回非零值
@ 需要注意 的是该函数不是重定位文件指针,而是重定位文件内部的指针,让指向文件内部数据的指针移到文件中我 们感兴趣的数据上,重定位主要是这个目的。
3个宏:
    SEEK_SET 0 文件开头
    SEEK_CUR 1 文件当前位置
    SEEK_END 2 文件结尾
    但不推荐用数字 最好用宏
例子:
      1. fseek(fp,100L,SEEK_SET); fp 指针移动到离文件开头 100 字节处;
      2. fseek(fp,100L,SEEK_CUR); fp 指针移动到离文件当前位置 100 字节处;
      3. fseek(fp,100L,SEEK_END); fp 指针退回到离文件结尾 100 字节处。
#include <stdio.h>
#include <string.h>


//FILE *fopen(const char *pathname, const char *mode);
//int fclose(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);
//int fseek(FILE *stream, long offset, int whence);


int main()
{
    FILE *flag=NULL;
    int ntd;
    char readbuff[12];//char readbuff[12]={0};
    char *writebuff="hello world";
    memset(readbuff,0,12);


    flag=fopen("/home/lhy/fmm","r+");
    if(flag==NULL)
   {
       printf("open failed!\n");
       return -1;
    
    }
    printf("open sussend!\n");


   ntd=fread(&readbuff,4,2,flag);
   if(ntd<=0)
  {
    printf("read failed!\n");
 
  }  
    printf("have readed = %s\n",readbuff);
  

  ntd=fseek(flag,1,SEEK_SET);//偏移起始位置1
  if(ntd){
     printf("fseek failed!\n");
     return -1;
   }
  printf("fseek succend!\n"); //fseek成功返回0 



   ntd=fwrite(writebuff,4,1,flag);
  if(ntd<=0){
     printf("write failed\n");
     return -1;
  }
  printf("have writed %d\n",ntd);


    ntd=fclose(flag);
    if(ntd){ 
       printf("close failed!\n");
      return -1; 
    }
    printf("close sussend=%d!\n",ntd);//关闭成功返回0

   return 0;
}


额~好像成功的英语拼写是succeed,printf里面一直都拼写错了,请原谅我英语烂(偷笑)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值