添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表

函数 功能
fopen() 打开流
fclose() 关闭流
fputc() 写一个字符到流中
fgetc() 从流中读一个字符
fseek() 在流中定位到指定的字符
fputs() 写字符串到流
fgets() 从流中读一行或指定个字符
fprintf() 按格式输出到流
fscanf() 从流中按格式读取
feof() 到达文件尾时返回真值
ferror() 发生错误时返回其值
rewind() 复位文件定位器到文件开始处
remove() 删除文件
fread() 从流中读指定个数的字符
fwrite() 向流中写指定个数的字符
tmpfile() 生成一个临时文件流
tmpnam() 生成一个唯一的文件名

fopen

  • 函数功能
    打开一个文件
  • 头文件
    #include <stdio.h>
  • 函数原型:
     FILE*  fopen(
        _In_z_ char const* _FileName,
        _In_z_ char const* _Mode
  • 参数说明
    filename :欲打开的文件路径及文件名
    mode : 代表流形式
参数说明
r只读方式打开,文件必须存在
r+以读/写方式打开文件,该文件必须存在
rb+以读/写方式打开一个二进制文件,只允许读/写数据
rt+以读/写方式打开一个文本文件,允许读和写
w打开只写文件,若文件存在则长度清为 0,即该文件内容消失,若不存在则创建该文件
w+打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件
a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF 符保留)
a+以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的 EOF 符不保留)。
wb以只写方式打开或新建一个二进制文件,只允许写数据。
wb+以读/写方式打开或建立一个二进制文件,允许读和写。
wt+以读/写方式打开或建立一个文本文件,允许读写
at+以读/写方式打开一个文本文件,允许读或在文本末追加数据。
ab+以读/写方式打开一个二进制文件,允许读或在文件末追加数据。

以 x 结尾的模式为独占模式,文件已存在或者无法创建(一般是路径不正确)都会导致 fopen 失败。文件以操作系统支持的独占模式打开。

上述的形态字符串都可以再加一个 b 字符,如 rb、w+b 或 ab+ 等组合,加入 b 字符用来告诉函数库以二进制模式打开文件。如果不加 b,表示默认加了 t,即 rt、wt,其中 t 表示以文本模式打开文件。由 fopen() 所建立的新文件会具有 S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666) 权限,此文件权限也会参考umask值。
在这里插入图片描述

  • 返回值
    文件顺利打开后,指向该流的文件指针就会被返回。
    文件打开失败则返回 NULL,并把错误代码存在 error 中。

一般而言,打开文件后会做一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在 fopen() 后作错误判断及处理。

  • 程序演示:
#include <stdio.h>
#define F_PATH "d:\\myfile\\file.dat"
int main(void)
    FILE *fp = NULL; /* 需要注意 */
    fp = fopen(F_PATH, "r");
    if (NULL == fp)
        return -1; /* 要返回错误代码 */
    fclose(fp);
    fp = NULL; /* 需要指向空,否则会指向原打开文件地址 */
    return 0;
#include <stdio.h>
#include <stdlib.h> /* 为了使用exit() */
int main(void)
    int i = 0; /* 用于 putchar & getc 的数据接收 */
    char *ch = "";
    FILE *fp = NULL;
    char fname[50]; /* 用于存放文件名 */
    printf("输入文件名:");
    scanf("%s", fname);
    fp = fopen(fname, "r"); /* 只供读取 */
    if (NULL == fp) /* 如果失败了 */
        printf("错误!");
        exit(1); /* 中止程序 */
    while ((ch[i] = getc(fp)) != EOF)
        putchar(ch[i]);
        i ++;
    fclose(fp); /* 关闭文件 */
    fp = NULL; /* 需要指向空,否则会指向原打开文件地址 */
    return 0;
注意!初学者往往会犯一个错误,即在输入文件名时不加后缀名,请注意加上!
更多: https://baike.baidu.com/item/fopen/10942321?fr=aladdin

fwrite:实现对数据块的写

  • 功能:
    将一块内存区域中的数据写入到本地文本。
  • 函数原型
     unsigned int fwrite(
        void const* _Buffer,        //指向数据块的指针
        unsigned int     _ElementSize,   //每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
        unsigned int     _ElementCount,  //数据个数
        FILE*       _Stream        //文件指针
  • 返回值
    返回值随着调用格式的不同而不同:
    (1) 调用格式:fwrite(buf,sizeof(buf),1,fp);
    成功写入返回值为1(即count)

    (2)调用格式:fwrite(buf,1,sizeof(buf),fp);
    成功写入则返回实际写入的数据个数(单位为Byte)

  • 举例

1024个(int)字节写入文本文件
#define DATA_SIZE 1024
int main(){
   unsigned int *dataPtr=NULL;
   dataPtr=(unsigned int *)malloc(sizeof(int)*DATA_SIZE);
   for(unsigned int i=0;i<DATA_SIZE;i++){
      dataPtr[i]=i;
   FILE  *fp=fopen("D:\\1.txt","w");
   fwrite(dataPtr,sizeof(int),DATA_SIZE,fp);
   fwrite(dataPtr,1,sizeof(unsigned int)*DATA_SIZE,fp);
   fcolse(fp);
   free(dataPtr);
   return 0;
下面的代码将4096char数据写到文本,写入的数据中,最大值为255,与上面代码有区别,因为缓存区数据类型不同 
#define DATA_SIZE 1024
int main(){
   unsigned char *dataPtr=NULL;
   //申请的数据缓冲区是4096个char
   dataPtr= (unsigned char*)malloc(sizeof(int)*DATA_SIZE);
   for(unsigned int i=0;i<DATA_SIZE;i++){
     dataPtr[i]=i;
   FILE *fp=fopen("D:\\1.txt","ad+");
   fwrite




    
(dataPtr,sizeof(char),DATA_SIZE*sizeof(int),fp);
   fclose(fp);
   free(dataPtr);
   return 0;
用malloc函数申请区域时是申请的一片char*区域,通过强制类型转换后可装unsigned int 数据。
#define DATA_SIZE 1024
int main(){
   unsigned char *dataPtr=NULL;
   unsigned int *p=NULL; 
   //申请的数据缓冲区是4096个char
   dataPtr= (unsigned char*)malloc(sizeof(int)*DATA_SIZE);
   //将char型缓存区强转成int型缓冲区
   p=dataPtr;
   for(unsigned int i=0;i<DATA_SIZE;i++){
     dataPtr[i]=i;
   FILE *fp=fopen("D:\\1.txt","ad+");
   fwrite(dataPtr,sizeof(unsigned int ),DATA_SIZE,fp);
   fclose(fp);
   free(dataPtr);
   return 0;

fread: 实现对数据块的读

  • 功能
    从一个文件流中读取数据

  • 函数原型

    unsigned int fread(
            void*  _Buffer,       //指向数据块的缓冲区
            unsigned int _ElementSize,  //每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
            unsigned int _ElementCount, //数据的个数
            FILE*  _Stream        //文件指针
    
  • 返回值
    返回值随着调用格式的不同而不同:

  1. 调用格式:fread(buf,sizeof(buf),1,fp);
    读取成功时:当读取的数据量正好是sizeof(buf)个Byte时,返回值为1(即count)
    否则返回值为0(读取数据量小于sizeof(buf))

  2. 调用格式:fread(buf,1,sizeof(buf),fp);
    读取成功返回值为实际读回的数据个数(单位为Byte)

    例如:fread(fa,4,5,fp); 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中

    int main(){
      FILE *fp=NULL;
      char fileDir[] ="D:\\1.txt";
      char data="Hello world";
      printf("sizeof(data) =%1d\n",sizeof(dataPtr));
      file=fopen(fileDir,"W+");
      //返回值为1
      int writecount=fwrite(data,sizeof(data),1,fp);
      printf("writecount= %d\n",writecount);
      fclose(fp);
      fp=NULL;
      fp=fopen(fileDir,"r");
      char buffer[255];
      //当读取的数据量正好是sizeof(buf)个Byte时,返回值为1(即count) 否则返回值为0(读取数据量小于sizeof(buf))
      int readcount=fread(buffer,sizeof(buffer),1,fp); //返回0
      int readcount1=fread(buffer,1,sizeof(buffer),fp);//返回读取的实际个数
      fclose(fp);
      printf("%s\n",buffer);
      return 0;
     学习来源:https://blog.csdn.net/yang2011079080010/article/details/52528261 
    

    fgetc:字符的读取