ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【C语言】文件操作 [打印本页]

作者: 莫张周刘王    时间: 2024-8-2 19:46
标题: 【C语言】文件操作
前言
  我们先假设想一下如果没有文件,我们写的步伐的数据是存储在电脑的内存中,如果步伐退出,内存接纳,数据就丢失了,等再次运行步伐,是看不到前次步伐的数据的,如果要将数据进行恒久化的生存,我们可以利用文件,本篇就来探讨一下C语言有关文件的操作。
  个人主页:小张同学zkf
  如有标题  评论区见
  感兴趣就关注一下吧
  

  
  目次
1.什么是文件 
1.1 步伐文件
1.2 数据文件
1.3 文件名
2.二进制文件和文本文件
3.文件的打开和关闭
3.1流和标准流
3.1.1流
 3.1.2标准流
3.2文件指针
3.3 文件的打开和关闭
4.文件的顺序读写
4.1顺序读写函数介绍
4.2fputc和fgetc
4.3fputs和fgets
4.4fread和fwrite
4.5对比一组函数
5.文件的随机读取
5.1fseek
5. 2ftell
5.3rewind
6. 文件读取结束的判定
6.1被错误利用的 feof
7. 文件缓冲区
 



1.什么是文件 

 磁盘(硬盘)上的文件是文件。 但是在步伐计划中,我们一样平常谈的文件有两种:步伐文件、数据文件(从文件功能的角度来分类的)。
1.1 步伐文件

   步伐文件包括源步伐文件(后缀为.c),目的文件(windows环境后缀为.obj),可执行步伐(windows环境后缀为.exe)。  1.2 数据文件

   文件的内容不一定是步伐,而是步伐运行时读写的数据,比如步伐运行必要从中读取数据的文件,大概输出内容的文件。       本章讨论的是数据文件。 在从前所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行效果显示到显示器上。        其实偶然候我们会把信息输出到磁盘上,当必要的时候再从磁盘上把数据读取到内存中利用,这里处理的就是磁盘上文件。     1.3 文件名

     一个文件要有一个唯一的文件标识,以便用户辨认和引用。        文件名包罗3部门:   文件路径+文件名主干+文件后缀           比方:    c:\code\test.txt        为了方便起见,文件标识常被称为文件名。      
   
    2.二进制文件和文本文件

     根据数据的构造情势,数据文件被称为   文本文件   大概   二进制文件   。        数据在内存中以   二进制的情势存储   ,如果不加转换的输出到外存的文件中,就是二进制文件。        如果要求在外存上   以ASCII码的情势存储   ,则必要在存储前转换。以ASCII字符的情势存储的文件就是文本文件。           一个数据在文件中是怎么存储的呢?           字符一律以ASCII情势存储,数值型数据既可以用ASCII情势存储,也可以利用二进制情势存储。           如有整数10000,如果以ASCII码的情势输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制情势输出,则在磁盘上只占4个字节(VS2019测试)。         
      
   
    3.文件的打开和关闭

  3.1流和标准流

  3.1.1流

     我们步伐的数据必要输出到各种外部设备,也必要从外部设备获取数据,差别的外部设备的输入输出操作各不相同,为了方便步伐员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。        
       3.1.2标准流

   那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?     
       那是因为C语言步伐在启动的时候,默认打开了3个流:            •     stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。           •     stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。           •     stderr - 标准错误流,大多数环境中输出到显示器界面。                这是默认打开了这三个流,我们利用scanf、printf等函数就可以直接进行输入输出操作的。              stdin、stdout、stderr 三个流的范例是:      FILE *           ,通常称为     文件指针     。              C语言中,就是通过      FILE*      的文件指针来维护流的各种操作的。            3.2文件指针

   缓冲文件系统中,关键的概念是“文件范例指针”,简称“文件指针”。     每个被利用的文件都在内存中开发了一个相应的文件信息区,用来存放文件的相干信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是生存在一个结构体变量中的。该结构体范例是由系统声明的,取名   FILE  .    比方,VS2013 编译环境提供的 stdio.h 头文件中有以下的文件范例申明:
      struct    _   iobuf    {        char    *_ptr;        int    _cnt;        char    *_base;        int    _flag;        int    _file;        int    _charbuf;        int    _bufsiz;        char    *_tmpfname;        };        typedef struct    _   iobuf FILE   ;      差别的C编译器的FILE范例包罗的内容不完全相同,但是大同小异。     每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信     息,利用者不必关心细节。     一样平常都是通过一个FILE的指针来维护这个FILE结构的变量,如许利用起来更加方便。        下面我们可以创建一个FILE*的指针变量:          FILE* pf;   //   ⽂件指针变量      界说pf是一个指向FILE范例数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。    比如:    

3.3 文件的打开和关闭

   文件在读写之前应该先打开文件,在利用结束之后应该关闭文件。     在编写步伐的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于创建了指针和文件的关系。    ANSI C 规定利用 fopen 函数来打开文件, fclose 来关闭文件。
      //   打开⽂件        FILE *    fopen    (    const char    * filename,    const char    * mode );        //   关闭⽂件        int    fclose    ( FILE * stream );      mode表现文件的打开模式,下面都是文件的打开模式:


  1. /* fopen fclose example */
  2. #include <stdio.h>
  3. int main ()
  4. {
  5. FILE * pFile;
  6. //打开⽂件
  7. pFile = fopen ("myfile.txt","w");
  8. //⽂件操作
  9. if (pFile!=NULL)
  10. {
  11. fputs ("fopen example",pFile);
  12. //关闭⽂件
  13. fclose (pFile);
  14. }
  15. return 0;
  16. }
复制代码


4.文件的顺序读写

4.1顺序读写函数介绍

 


   上面说的适用于所有输入流一样平常指适用于标准输入流和其他输入流(如文件输入流);所有输出流一样平常指适用于标准输出流和其他输出流(如文件输出流)。  4.2fputc和fgetc

   
    这个函数就是把字符写到文件里,若写入乐成,返回的是这个字符的asc码值,若失败,返回EOF(-1)

这个函数就是把这个文件里的数据一个字符一个字符的读取出来,若读取乐成,返回的是读取乐成的字符的asc码值,若读取到文件末尾,返回EOF(-1)
4.3fputs和fgets

 fputs是以文本行的情势将字符串写入文件里,若写入乐成,返回非负值,若失败,返回EOF(-1)

这个num是要在文件里读多少个字符,str是把字符读出来之后存放的所在,stream要读的文件
若读取乐成,返回str,若失败,返回空指针
4.4fread和fwrite


ptr是存放要写入这个文件的指针,size是输入这个文件每个元素的字节大小,count是写入这个文件的个数,steam是要写入的文件,写进去的文件里的数据转换成二进制信息
返回乐成写入文件的个数,若返回的个数与count差别,则写入失败

这个就和上面的刚好相反,把文件里的二进制数据以size每个元素字节大小和count个数读取到ptr指向的空间,返回的是乐成读取的个数,若返回的数与count差别,则读取失败
4.5对比一组函数

      scanf/fscanf/sscanf        printf/fprintf/sprintf   

你会发现fprintf与fscanf参数与printf和scanf相比就前面多个文件指针参数,剩下的都一样,他们都是以指定格式写入文件或从文件读取
那sscanf与sprintf是什么那
sscanf就是把字符串读成格式化数据
sprintf就是把格式化数据转化成字符串
 



5.文件的随机读取

5.1fseek

偶然候我们文件里的光标可能必要为我们移动到自己想要的位置,那该怎么做那

必要用到fseek函数 
功能:根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。 
      int    fseek    ( FILE * stream,    long int    offset,    int    origin );    offset是偏移量,origin是起始位置,起始位置有三种情况:


  1. #include <stdio.h>
  2. int main ()
  3. {
  4. FILE * pFile;
  5. pFile = fopen ( "example.txt" , "wb" );
  6. fputs ( "This is an apple." , pFile );
  7. fseek ( pFile , 9 , SEEK_SET );
  8. fputs ( " sam" , pFile );
  9. fclose ( pFile );
  10. return 0;
  11. }
复制代码
5. 2ftell

   返回文件指针相对于起始位置的偏移量,就是盘算偏移量的。           long int     ftell     ( FILE * stream );        

  1. #include <stdio.h>
  2. int main ()
  3. {
  4. FILE * pFile;
  5. long size;
  6. pFile = fopen ("myfile.txt","rb");
  7. if (pFile==NULL)
  8. perror ("Error opening file");
  9. else
  10. {
  11. fseek (pFile, 0, SEEK_END); // non-portable
  12. size=ftell (pFile);
  13. fclose (pFile);
  14. printf ("Size of myfile.txt: %ld bytes.\n",size);
  15. }
  16. return 0;
  17. }
复制代码
5.3rewind

   让文件指针的位置回到文件的起始位置       void rewind ( FILE * stream );
  

  1. #include <stdio.h>
  2. int main ()
  3. {
  4. int n;
  5. FILE * pFile;
  6. char buffer [27];
  7. pFile = fopen ("myfile.txt","w+");
  8. for ( n='A' ; n<='Z' ; n++)
  9. fputc ( n, pFile);
  10. rewind (pFile);
  11. fread (buffer,1,26,pFile);
  12. fclose (pFile);
  13. buffer[26]='\0';
  14. printf(buffer);
  15. return 0;
  16. }
复制代码


6. 文件读取结束的判定

6.1被错误利用的 feof

很多人用feof是用来判断文件是否结束的,这是错误的!!!
   牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。     feof   的作用是:当文件读取结束的时候,判断是读取结束的缘故原由是否是:  遇到文件尾结束  。            文本文件读取是否结束,判断返回值是否为     EOF     (     fgetc     ),大概     NULL     (     fgets     )           比方:           •     fgetc     判断是否为     EOF           •     fgets     判断返回值是否为     NULL               二进制文件的读取结束判断,       判断返回值是否小于实际要读的个数。        比方:        •    fread判断返回值是否小于实际要读的个数。      

  


      文本文件的例子:       #   include    <stdio.h>        #   include    <stdlib.h>        int    main   (   void   )        {        int    c;    //    注意:   int   ,⾮   char   ,要求处理   EOF        FILE* fp = fopen(   "test.txt"   ,    "r"   );        if   (!fp) {        perror(   "File opening failed"   );        return    EXIT_FAILURE;        }        //fgetc    当读取失败的时候大概遇到⽂件结束的时候,都会返回   EOF        while    ((c = fgetc(fp)) != EOF)    //    标准   C I/O   读取⽂件循环        {        putchar   (c);        }        //   判断是什么缘故原由结束的        if    (ferror(fp))        puts   (   "I/O error when reading"   );        else if    (feof(fp))        puts   (   "End of file reached successfully"   );        fclose(fp);        }   
    二进制文件的例子:
  
     #   include    <stdio.h>        enum    { SIZE =    5    };        int    main   (   void   )        {        double    a[SIZE] = {   1.   ,   2.   ,   3.   ,   4.   ,   5.   };        FILE *fp = fopen(   "test.bin"   ,    "wb"   );    //    必须⽤⼆进制模式            fwrite(a,     sizeof     *a, SIZE, fp);           //         double     的数组           fclose(fp);           double     b[SIZE];           fp = fopen(    "test.bin"    ,    "rb"    );           size_t     ret_code = fread(b,     sizeof     *b, SIZE, fp);     //         double     的数组           if    (ret_code == SIZE) {           puts    (    "Array read successfully, contents: "    );           for    (    int     n =     0    ; n < SIZE; ++n)           printf    (    "%f "    , b[n]);           putchar    (    '\n'    );           }     else     {     // error handling           if     (feof(fp))           printf    (    "Error reading test.bin: unexpected end of file\n"    );           else if     (ferror(fp)) {           perror(    "Error reading test.bin"    );           }           }           fclose(fp);           }      
7. 文件缓冲区

   ANSIC 标准接纳“缓冲文件系统” 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为步伐中每一个正在利用的文件开发一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向盘算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到步伐数据区(步伐变量等)。缓冲区的大小根据C编译系统决定的   
  
   这里可以得出一个结论:     因为有缓冲区的存在,C语言在操作文件的时候,必要做刷新缓冲区大概在文件操作结束的时候关闭文件。   

   结束语
  本篇博客涉及知识多,小编也在尽力总结,可以采取对比影象等方法影象,文件操作有关知识就总结到这里吧
  OK感谢观看!!!
  

  
  





         



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4