C语言关于文件的一些基础知识

一:关于文件的打开与关闭

        1:什么是文件?

                在C语言中,文件是数据的集合,可以被储存在计算机的存储设备上。文件一般有:程序文件与数字文件。在C程序中,可以使用文件来读取和写入数据。

        1.1:程序文件

                        程序文件是包含计算机程序源代码的文件。在C语言中,程序文件通常具有扩展名为“.c”的文件名后缀,目标文件(后缀为.obj),以及可执行程序(后缀为.exe)。

        1.2:数据文件:

                        数据文件是存储数据的文件,与程序文件相对。

        1.3:文件名:

                        一个文件都要有一个唯一的文件表示,以便用户的识别与引用。文件一般包含三个部分:文件路径+文件主干名+文件后缀,例如c:.\user\text.txt。

     

          2:文件指针:

                文件指针是一个特殊类型的指针,用于跟踪程序中打开的文件。它们是用来读取和写入文件的关键工具。文件指针提供了对文件的访问和操作,允许程序在文件中定位特定的位置,并进行读取、写入等操作。文件指针的类型取名为FILE。

                

           如上示例,创建了一个FILE类型的指针变量,可以使ptr1的指针指向某个文件信息区。也就是说可以通过文件指针找到与它相关联的文件信息。

        2.1:文件的打开与关闭

                文件在读写的时候应该先打开文件,在使用结束后关闭文件

                

        如上图所示,创建了一个文件指针类型(FILE*)的指针ptr,通过fopen函数指向要打开的文件,最后通过fclose函数将文件指针ptr传入函数进行关闭文件的操作。

                

       

二:关于文件的读写

                关于文件的如何读写的首先需要了解流的概念。

        1:什么是流?

                流(stream)是一种抽象的概念,用于表示数据的输入和输出。流可以来自于各种不同的源,比如键盘、文件、网络连接等,也可以输出到各种不同的目的地。我们可以抽象理解成,数据就是一条河流,那么数据的流动就像河流一样,可以将数据流流动到屏幕、文件、网络等。

        所有流与标准流:

                在c语言中有标准流与所有流的区分,那么什么是标准流?

        2:标准流

        标准输入流(stdin):这是程序默认的输入流,通常用于从键盘获取用户输入。当用户键入信息并按下回车键时,数据将被发送到程序的stdin流中。它在程序开始运行时自动打开。

        标准输出流(stdout):这是程序默认的输出流,通常用于向屏幕打印信息。当程序使用printf()等函数输出信息时,数据将被发送到stdout流中。它在程序开始运行时自动打开。

        标准错误流(stderr):这是程序默认的错误输出流,通常用于向屏幕打印错误和诊断信息。与stdout类似,它在程序开始运行时自动打开。

        这三个流都是c语言默认开启的,在函数scanf与print就是默认的开启标准流,从用户将键盘中输入的数据进行输入与输出操作。

        3:所有流:

                所有流不仅可以从键盘上得到数据的输入与输出,还可以通过文件中的数据进行输入与输出操作。

        文件流的输入:对于通过文件操作打开的流,可以使用fscanf()fgets()等函数从文件中读取数据,方法与从标准输入流中读取数据类似

        文件流的输出:可以使用fprintf()fputs()等函数将数据输出到文件流中,方法与向标准输出流中输出数据类似。

        4:关于文件中的函数介绍

                                

        

        4.1输出单个数据到文件:fputc()

        

        如上图所示,定义了一个FILE的文件指针,指向了text.txt的文件并且用”w“(写)的形式来操作文件,如果pf为空值,那么打开文件失败,输出错误报告并结束程序。如果不为空那么程序继续,定义了变量i,将i初始化为'a',并用for循环,使用fputc函数将文本循环写入’a‘到’z‘的字母。可以看到text.txt的文件被写入了母'a'到'z'。

        4.2:从文件单个数据读取数据:fgetc()

        

                从上示例可以看到,刚才将字母a到z放入文件后,这次将pf的指针再次指向刚才的文件,并且用”r“读取的形式来操作文件,定义了变量ch,通过while循环,运用fgetc函数每一次读取得到文件中单个的数据,并且打印出来。循环退出的判断条件为EOF,EOF用来判断程序是否已经读取到文件的末尾。   

                注:fgetc判断读取文件是否到达末尾的条件为EOF,fgets的判断条件为是否为NULL。

        4.3输出字符串数据到文件:fputs( )

                        

       从上图示例可以看出,运用fputs函数,第一个参数为需要输出的数据,第二个参数为存放数据的文件。将字符串“ikunikun”,直接输出到文件中,而不是单个的进行输出。

 

        4.4从文件中得到一行数据:fgtes( )

                

        从上图示例可以看出,运用fgets函数,第一个参数arr 指向用于存储读取字符串的字符数组的指针,第二个参数为需要读取的数量,(包括\0字符),第三个参数 为要读取输入的文件。

        从上个例子我们已经将字符串“ikunikun”字符串放入了文件中,通过fgets函数将文件中的字符串存入了arr数组中,但是并没有读取20个数据,因为文件中最多只有8个数据,当读完八个数据,文件就读到了结尾会直接返回,并不会强行继续去读取剩下没读完的数量。而fgets最多读取n-1个字符,因为最后一个位置需要留给’\0‘, 或者直到遇到换行符('\n')停止。

        4.5:将格式化的数据输出到文件 :fprintf()

        

        上示例定义了一个结构体变量并且将结构体变量进行初始化操作,接着定义一个文件指针,并用”w“的形式操作文件,接着运用fprintf函数,将格式化的数据输出到文件。从文本中可以观察到结构体变量被格式化的输出到文件中,而不是变成字符串的形式。

                                                                                                                                                            

        fprintf函数中的第一个参数为目标文件,第二个参数为数据的输出格式。

                                                                                                                                                                        4.6:获取文件中格式化的数据 :fscanf()

                                                                                                                                                                                                                                                                     

        与fprintf函数类似,刚才已经将数据格式化的输出至文件,现在运用fscanf函数获取文件中格式化的数据。

        4.6:关于文件的二进制写入wb与函数fwirte

        

                通过上图示例,先创建了一个结构体并进行初始化,接着创建文件指针并打开文件,但注意这边的打开方式为”wb“(以二进制的形式进行写入)。接着通过fwrite函数,将初始化后的结构体数据以二进制的形式写入到文本中,这时候打开文本,就会看到一些奇怪的字符。

        4.7:关于文件的二进制读取rb与函数fread

                        

                

        从上图示例可以看出,函数fread与函数fwrite相似,一个是以二进制写入文件,一个是以二进制读取文件。注意这边fopen函数对文件的打开方式为 "rb" (只写),然后通过fread函数将文件里的内容以二进制的形式读取出来,存入结构体变量s中,最后进行输出,可以看到此时的内容不再是奇奇怪怪的数字。

        4.8:函数sprintf( )与函数sprintf():

        

        

        通过上图示例,创建了一个结构体类型,并将结构体进行初始化,接着创建了char类型的数组待会存放字符串。使用sprintf函数,将结构体里的数据转换成了字符串,用printf(”%s“)可以证明这一点。再创建了一个相同类型的结构体变量,使用sscanf函数,将buff里的字符串重新转换成结构体数据,存放在temp中,最后再次格式化打印结构体里的数据。

        

        补充:

                

      4.9:fseek函数:

                               

      fseek()函数是C语言标准库中用于设置文件位置指针的函数。它可以将文件位置指针移动到文件中的任意位置,从而实现对文件的随机访问。通过上图示例,定义了一个文件指针pf,指向了”text.txt“的文件,打开方式为”r“。 

        第一次 fseek(pf,2,SEEK_SET)表示将文件的光标从pf所指向的文件中的文件开头(SEEK_SET)开始向右偏移两个位置,此时光标指向了数据c的位置,再通过变量ch将数据c打印出来,此时文件光标已经指向了下一个数据d的位置。

        第二次使 用fseek(pf,2,SEEK_CUR)表示上一次文件光标的位置接着向右偏移两个数据的位置及从d位置开始+2指向了f的位置,接着输出f数据

        最后一次 使用fseek函数(pf,-1,SEEK_END),表示将文件的光标指向了文件末尾处,这里并非指向f数据的位置,而是指向了f后面位置,接着通过-1使文件向左偏移一个位置得到f位置,将据f打印出来。

4.10:ftell函数

        

                

    ftell()函数返回stream指针所指向文件中的当前位置,返回值为文件首位置与当前位置的偏移量。

        4.11:rewind函数:

                        

     rewind()函数,用于将文件位置指针重新定位到文件的开头。

三:关于文件缓冲区:

        文件缓冲区是计算机系统中用于临时存储文件数据的一种内存区域,通常用于提高文件操作的效率和性能。当程序读取或写入文件时,数据通常会先被放置在文件缓冲区中,然后才被写入到文件或从文件读取。

        

文件缓冲区的存在对文件操作带来了以下几点好处:

1:提高性能:通过将数据暂时存储在内存中,减少了频繁的磁盘I/O操作,从而提高了文件操作的速度和效率。

2:减少系统调用:将多次小的文件读写操作合并成一次较大的操作,减少了系统调用的次数,降低了系统开销。

3:提高灵活性:缓冲区允许程序在内存中对文件数据进行操作,可以灵活地控制读写的顺序和方式,提高了程序的灵活性和可控性。

        文件缓冲区也可能导致一些问题,例如数据丢失、缓冲区溢出等。因此,在适当的时候,需要使用fflush()函数刷新缓冲区,将数据写入到文件中。

                

        

        

        从上图示例可以看出,文件确实存在缓冲区的概念,当程序刚开始运行时,程序先将字符串“abcdef”放入缓冲区中,并没有真正放入文件,此时打开文件会发现文件并没有被写入数据。接着等待十秒钟后接着执行fflush函数(刷新缓冲区),当刷新完成后,存放再缓冲区里的数据才会真正的被写入文件中,此时打开文件发现文件已经存放着字符串的数据。在文件关闭的时候同样也会刷新缓冲区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值