c语言文件操作的头文件,C语言文件操作

  c语言文件操作的头文件,C语言文件操作

  我将为假期做笔记。

  这个月可能会发表十几二十篇。

  为什么在这个目录中使用文件?什么是文件、程序文件、数据文件、文件名、文件打开和关闭功能?按文件顺序读写fprintf和fscanf?fscanf和scanf的比较?sprintf和sscanf与原信的比较数字比较输入输出函数文件的随机读写fseek ftell倒带文本文件和二进制文件的文件结束标记的判定文件缓冲区

  为什么我们在使用文件之前研究结构的时候还要写通讯录程序?当地址簿运行时,我们可以添加和删除地址簿中的数据。此时,数据存储在存储器中。程序退出,通讯录里的数据自然就不存在了。下次运行地址簿程序时,必须重新输入数据。这样的通讯录很难用。

  我们在想,既然是通讯录,就应该记录信息。只有当我们选择删除数据时,数据才会停止存在。

  这就涉及到数据持久化的问题。我们的数据持久化的一般方法包括将数据存储在磁盘文件和数据库中。

  通过使用文件,我们可以将数据直接存储在计算机的硬盘上,这使得数据具有持久性。

  什么是文件?我们根据文件的不同功能把它们分为程序文件和数据文件。

  当然,通俗点说,存储在磁盘上的文件就是文件。(好像是废话=-=)

  程序文件

  包含源文件(后缀。c)、目标文件(后缀。windows环境下的obj)和可执行程序(后缀。windows环境下的exe)。

  数据文件

  本章主要讲数据文件:内容不一定是程序,而是程序运行时读写的数据,比如程序需要从中读取数据的文件或者输出内容的文件。

  在前面的章节中,处理的数据的输入输出都是面向终端的,即从终端的键盘输入数据,运行结果显示在显示器上。

  事实上,有时我们会将信息输出到磁盘,然后将磁盘中的数据读取到内存中,以便在需要时使用。我们在这里处理的是磁盘上的文件。

  文件名文件应该有唯一的文件标识,以便用户可以识别和引用它。

  文件名包含三个部分:文件路径、文件名、主干文件后缀

  例如,c:\code\test.txt是一个文件名。

  其中c:\code\是文件路径,test是文件名的主干,txt是文件后缀。

  为了方便起见,我们称文件标识为文件名。

  当我们通过函数打开一个文件时,函数会返回一个文件类型的指针,一般称为文件类型指针或文件指针。文件类型实际上是我们的编译器自动创建的结构类型3354,用于存储文件的相关信息。之后,我们的编译器重命名了结构标题文件。

  struct _iobuf {

  char * _ ptr

  int _ cnt

  char * _ base

  int _ flag

  int _ file

  int _ charbuf

  int _ bufsiz

  char * _ tmpfname

  };

  typedef struct _iobuf文件;例如,我们的stdio.h文件的存储和命名就像VS2019中的上述结构一样。当然,结构信息的填充已经由我们的编译器完成了,我们不需要知道它的细节。

  一般来说,这种文件结构的变量是由一个指向FILE的指针来维护的,这样使用起来更方便。

  下面我们可以创建一个FILE*的指针变量:

  FILE * pf//文件指针变量

  Pf是一个指针变量,指向文件类型的数据。你可以让pf指向一个文件的文件信息区(这是一个结构变量)。可以通过文件信息区中的信息访问该文件。也就是说,可以通过文件指针变量找到与之关联的文件。

  打开和关闭文件的函数使用ANSIC指定fopen函数用于打开文件,fclose用于关闭文件。

  //打开文件

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

  //关闭文件

  int fclose(FILE * stream);fopen函数使用:

  返回值是我们文件类型的指针,所以我们要用文件类型的指针接收它,这样我们就可以通过指针调用它。

  Filename是我们的文件主干的扩展名或文件名。当我们创建的文件在我们的项目文件夹中时,我们可以使用file backbone+extension直接打开它。当我们的文件在其他文件夹的时候,需要加上文件路径(注意\当和后面的数字组合在一起的时候会变成转义字符,所以需要用\ \来实现)。

  int main()

  {

  FILE* pf=fopen(test.dat , w );//直接通过文件主干后缀

  返回0;

  }

  //或者添加文件路径

  int main()

  {

  FILE* pf=fopen(D:\\编辑语言\ \ the-way-of-c-language-learning \ \ 1.26 \ 1.26 \ \ test . dat , w );//通过路径文件主干后缀

  返回0;

  }当然,我们所有通过函数创建的文件,都可以直接用file后缀找到。

  模式是我们使用这个文件的模式。

  使用下表:

  文件使用模式

  意义

  如果指定的文件不存在

  “r”(只读)

  要输入数据,请打开现有的文本文件。

  犯错误

  “W”(只写)

  要输出数据,请打开一个文本文件。

  创建一个新文件。

  “a”(附加)

  将数据添加到文本文件的末尾

  创建一个新文件。

  “rb”(只读)

  要输入数据,请打开一个二进制文件。

  犯错误

  “wb”(只写)

  要输出数据,请打开一个二进制文件。

  创建一个新文件。

  “ab”(附加)

  将数据添加到二进制文件的末尾。

  犯错误

  “R”(读和写)

  要读写,请打开一个文本文件。

  犯错误

  “W”(读写)

  建议一个用于读写的新文档。

  创建一个新文件。

  “A”(阅读和写作)

  打开一个文件,在文件末尾读写。

  创建一个新文件。

  “rb”(读和写)

  打开一个二进制文件进行读写。

  犯错误

  “wb”(读和写)

  为读写创建一个新的二进制文件。

  创建一个新文件。

  “ab”(读和写)

  打开一个二进制文件,在文件末尾读写。

  创建一个新文件。

  fclose的使用:

  给他指向要关闭的文件的指针。

  示例:

  #包含stdio.h

  int main()

  {

  FILE * pFile

  //打开文件

  pFile=fopen (myfile.txt , w );

  //文件操作

  如果(pFile!=NULL)//fopen打开失败会返回一个空指针,所以使用时最好检查一下。

  {

  fputs (fopen example ,pFile);

  //关闭文件

  fclose(pFile);

  }

  返回0;

  }

  文件的顺序读写

  首先介绍以下流:我们的程序需要输出到不同的地方,流是程序和需要接收信息的地方之间的一部分。流可以改变程序的形式,使程序匹配所需的位置。

  所以上图的应用实际上适用于什么流。

  编程时我们默认打开三个流。

  标准输入流向键盘标准输出流向屏幕标准错误流向屏幕fgetc:

  int fgetc(FILE * stream);从文件指针指向的位置读取一个字符,并返回该字符的ASCII值。如果读取失败,返回EOF,然后将文件指针向后移动一位。

  注意返回值是int。

  是为了救EOF。

  fputc:

  int fputc( int c,FILE * stream);将一个字符放入文件流(或其他传入的流)。

  标准输出流也是可能的。

  将fprintf和fscanf与原函数进行比较,我们比较printf和fprintf:

  fprintf和printf只多了一个流,我们就直接把文件指针传递给Fprintf,这样就可以像printf一样使用Fprintf了,只不过我们面对的对象从缓冲区变成了文件。

  例如fprintf (pt, % s ," abcdef));就是把abcdef打印到文件里。

  CANF与fscanf的比较

  还有一个文件指针比scanf多,可以从文件中读取数据,存储在变量中。

  如fscanf(pf, %s ,arr);将pf文件中的字符串%s读入arr。

  有时,会检查sprintf、printf、sscanf和scanf之间的比较。

  sprintf和sscanf与原始函数sprintf的比较:

  Sprintf比printf多一个缓冲区。与printf不同的是,sprintf会将下面的内容打印到缓冲区中,不管后面的内容是整形还是浮点,都会转换成字符串打印到缓冲区中。

  sscanf:

  多了一个缓冲区,sscanf就从字符串缓冲区读取信息,并放入相应的内容中。

  总结:

  输入函数fread:读出二进制文件中的信息,放入一个变量中。

  Buffer是我们想要存储信息的变量地址。size是要读取的信息的大小。count是要读取的信息的数量。流是文件指针。返回值是读取的数据的数量。如果未读取,将返回0fwrite:输入信息以二进制形式存储在文件中。

  注意以二进制形式存储的文件不能直接打开读取(毕竟不能读取=-=)

  一般来说,总统是这样的:

  * * FWRITE: * *类似于fread,但从阅读改为写作。

  (在使用这些功能之前,记得将fopen的打开模式调整到相应的模式。)

  使用内存关闭并将空指针赋给指针。

  在这一段中,我们使用函数来调整文件指针的偏移量和指向。

  fseekint fseek( FILE *stream,long offset,int origin);

  根据文件指针的位置和偏移量定位文件指针。

  首先我们要知道我们的文件指针会随着你的操作而移位,这个函数可以控制文件指针的指向。

  或者我们的stream,offset是调整文件指针偏移量多少(不知道,先看例子)

  产地:有三种:

  SEEK_CUR从文件指针的当前位置调整偏移量(取决于偏移量的值)。SEEK_END调整从文件末尾的偏移量(此时offset一般为负)。SEEK_SET调整从文件开始的偏移量(偏移量一般为正)。示例:

  使用fseek之前:

  #包含stdio.h

  int main()

  {

  //打开文件

  FILE * pf

  pf=fopen(test.dat , r );//这个文件已经提前放入abcdefg了

  //使用文件

  int ret=0;

  ret=getc(pf);

  printf(%c ,ret);

  ret=getc(pf);

  printf(%c ,ret);

  ret=getc(pf);

  printf(%c ,ret);

  ret=getc(pf);

  printf(%c ,ret);

  //关闭文件

  fclose(pf);

  pf=NULL

  返回0;

  }//运行结果:abcd使用fseek后:

  #包含stdio.h

  int main()

  {

  //打开文件

  FILE * pf

  pf=fopen(test.dat , r );//这个文件已经提前放入abcdefg了

  //使用文件

  int ret=0;

  ret=getc(pf);

  printf(%c ,ret);

  fseek(pf,-1,SEEK _ CUR);//将文件指针向前移动一位

  ret=getc(pf);

  printf(%c ,ret);

  ret=getc(pf);

  printf(%c ,ret);

  ret=getc(pf);

  printf(%c ,ret);

  //关闭文件

  fclose(pf);

  pf=NULL

  返回0;

  }//运行结果:aabc我们通过fseek调整了文件指针的指向。

  ftelllong ftell(文件*流);给他一个文件指针,他返回一个值,这个值与文件开头的当前指针的偏移量进行比较。

  rewindvoid rewind(文件*流);让文件指针返回到文件的开头。

  文本和二进制文件根据数据的组织形式,数据文件被称为文本文件或二进制文件。

  数据以二进制形式存储在内存中,如果输出未经转换就导出到外部存储器,则是二进制文件。

  如果要求在外存上以ASCII码的形式存储,则需要在存储前进行转换。以ASCII字符形式存储的文件是文本文件。

  一段数据是如何存储在内存中的?

  所有字符都以ASCII形式存储,数字数据可以以ASCII形式或二进制形式存储。如果有一个10000的整数,如果以ASCII码的形式输出到磁盘,在磁盘上占用5个字节(每个字符一个字节),而如果以二进制的形式输出,在磁盘上只占用4个字节。

  文件结束标志的确定首先引入了feof函数。

  feof:

  int feof(FILE * stream);用于确定文件指针如何结束:

  文件读取失败结束返回0。文件读取结束返回真值(非零),真正用来判断文件读取结束是否依赖于getc、gets、fread的返回值。

  Fgetc确定是否是EOF。fgets确定返回值是否为空。二进制文件取决于fread的返回值是否大于要读取的完整元素的返回值。

  文件缓冲区与标准输入相同。我们在操作文件的时候也有缓冲区的概念。

  ANSIC标准使用“缓冲文件系统”来处理数据文件。所谓缓冲文件系统,就是系统自动为程序中正在使用的每个文件在内存中打开一个“文件缓冲区”。从内存输出到磁盘的数据会先送到内存中的缓冲区,等缓冲区满了再一起送到磁盘。如果从磁盘中读取数据到计算机,从磁盘文件中读取的数据被输入到内存缓冲区(满缓冲区),然后数据从缓冲区发送到程序数据区(程序变量等)。)一个一个来。缓冲区的大小由C编译器系统决定。

  #包含stdio.h

  #包含windows.h

  //VS2013 WIN10环境测试

  int main()

  {

  FILE*pf=fopen(test.txt , w );

  fput( abcdef ,pf);//首先将代码放入输出缓冲区

  Printf(睡眠10秒-数据已写入,打开test.txt文件,发现文件没有内容\ n );

  睡眠(10000);

  Printf(刷新缓冲区\ n );

  fflush(pf);//当刷新缓冲区时,输出缓冲区的数据被写入文件(磁盘)

  //注意:fflush不能在VS的更高版本上使用。

  printf(‘再休眠10秒——此时,再次打开test.txt文件,文件有内容\ n’);睡眠(10000);

  fclose(pf);

  //注意:当fclose关闭文件时,也会刷新缓冲区。

  pf=NULL

  返回0;

  }由于缓冲区的存在,C语言在操作文件时,需要在文件操作结束时刷新缓冲区或关闭文档。否则可能会导致读写文件时出现问题。

  转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: