C/C++知识点之C-fopen,fwrite,fread,fseek笔记
小标 2018-08-10 来源 : 阅读 1300 评论 0

摘要:本文主要向大家介绍了C/C++知识点之C-fopen,fwrite,fread,fseek笔记,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之C-fopen,fwrite,fread,fseek笔记,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

所需库: <stdio.h>
返回值

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

路径
mode

打开模式,包括有以下几种
r      以只读方式打开文件,该文件必须存在。
r+    以读/写方式打开文件,该文件必须存在。
rb+  以读/写方式打开一个二进制文件,只允许读/写数据。
rt+   以读/写方式打开一个文本文件,允许读和写。
w     打开只写文件,若文件存在则长度清为 0,即该文件内容消失,若不存在则创建该文件。
w+   打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a     以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(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 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\n",fp == NULL,sizeof(readbuf));

       if(fp!=NULL)          //打开成功,读数据
       {
              len=fread(&readbuf,sizeof(int),1,fp);

              printf("read len=%d  data=%d\n",len,readbuf);

              fseek(fp,-sizeof(int),SEEK_END);

              fread(&readEnd,sizeof(int),1,fp);

              printf("read file end =%d\n",readEnd);

              fclose(fp);

       }
       else                      //打开失败,则创建文件
       {
              fp = fopen("./1.txt","wb+");

              printf("write  1.txt:    fp==NULL=%d  size=%d\n",fp == NULL,sizeof(readbuf));

              if(fp!=NULL)
              {
                 len=fwrite(&writebuf,sizeof(int),1,fp);
                 printf("write len=%d  \n",len);
                 fclose(fp);
              }
       }
       return 0;
}

 
复制代码
运行第一次:

 

运行第二次

 

 

 

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

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

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程