天天看点

文件操作 重点 盲区

*本文图片显示的代码中 fp 表示创建的文件指针变量名*

文件名

平常我们所说的文件名就是我们在文件夹或桌面见到的文件名称,如下图,分别是图片文件,markdown文件和文本文件和文件主人取的名字;

文件操作 重点 盲区

编程领域:在平常所说的文件名前加上路径。

如(C:\Users\王琳\Desktop\转专业\大一\c语言.txt)

文件概念

文件是存放数据的一种媒介,存放在外存中。

其实有时候我们会把信息(数据)输出到磁盘上形成文件,当需要的时候再从磁盘上把文件中数据读取到内存中使用,这里处理的就是磁盘上文件。

它是一种存储在外部介质上的数据的集合。

所以我们说文件都是存储在外存中的,当需要使用时从外存中拿取数据到内存或从内存中输入数据到外存中;

数据传输路径

如下图所示,我们输入数据一般从内存中,即程序数据区输出到缓冲区,待缓冲区被数据充满即存入外存;当从外存中读入数据时,数据先从外存中 存入输入缓冲区,等到缓冲区充满再发送给程序数据区。

文件操作 重点 盲区

缓冲区

之所以要存在缓冲区,主要有两个原因:

  1. CPU的读写速度与硬盘不匹配:由于CPU的读写速度远高于硬盘,所以当程序进行读写操作时是需要等待的,

而当一个计算机的所有程序都需要等待硬盘时,大家的体验就会很可怕,相信大家都被坐在电脑桌前几十秒几分钟啥也不能干的那种焦躁给支

配过。但是有了缓冲区,就可以将数据先放入缓冲区中,程序可以继续向下执行而无需等待,等到缓冲区充满了便将数据全部放入硬盘中,而

缓冲区又可以开始存入新一轮的数据。

  1. 减少操作硬件的次数

当我们写入数据的时候,每写入一次都要操作一次磁盘I/O,而硬盘的速度是非常慢的(相对于cpu),所有当有大量的小数据时,如果每次都

把这些数据放进磁盘,那每一次都要进行一次磁盘I/O操作,这就会很慢。所以把这些小数据存入缓冲区堆积着,等充满,小数据变成大数据,

然后一次性I/O写入磁盘,这样就让原本的无数次I/O简化成了1次,大大的提高了效率。

文件使用方式

(以下图片所涵盖的文件读写方式大家可自行前往各网站搜索学习资源学习文件操作方式,在此列出一些本人学习时得到的经验):w或w+,wb

都是会覆盖,文件的数据写入都是覆盖式写入,无论文件是否存在,都会新建一个文件,清空老文件里的数据。或者a+,读写方式打开文件,写入

数据总是写入到文件末尾,也叫追加写,不会清空之前数据,也可用r+,打开的时候保留文件原有内容。

文件操作 重点 盲区

文件操作的函数使用

像fgets这样的函数(比如fputs)要注意文件数据后是否有换行符跟随,如下图 :

hello后面带了一个换行符,用printf函数输出在屏幕时结果将自动携带换行符。

文件操作 重点 盲区

而像这样:

文件操作 重点 盲区

*对于其他函数大家可自行测试*

ssacanf,sprintf函数

作用:

  1. sscanf是从一个文件中读取格式化数据
  1. sprintf是把格式化的数据转换成字符串存储到一个文件中

fseek函数

定义

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

使用方法

以下三者代表文件指针起始位置的不同

以字符串为例: "abcdef" ,seek_set 就是从a开始作为起始位置,seek_end起始位置则是在f后面。

比如 *fseek ( fp , 2 , seek_set)*得到的结果就是c,而使用 fseek( fp , -2 , seek_end) 则是得到e

文件操作 重点 盲区

ftell函数

定义

返回文件指针相对于起始位置的偏移量

使用方法

文件操作 重点 盲区

rewind函数

作用

让文件指针的位置回到文件的起始位置

void main( void )
{
   FILE *stream;
   int data1, data2;

   data1 = 1;
   data2 = -37;

   if( (stream = fopen( "rewind.out", "w+" )) != NULL )
   {
      fprintf( stream, "%d %d", data1, data2 );
      printf( "The values written are: %d and %d\n", data1, data2 );
      rewind( stream );
      fscanf( stream, "%d %d", &data1, &data2 );
      printf( "The values read are: %d and %d\n", data1, data2 );
      fclose( stream );
   }
}
      

strerror函数

返回值是错误码对应信息的字符串地址,也即错误原因,和perror函数类似

使用方法
文件操作 重点 盲区

perror

会打印对应的错误原因

文件操作 重点 盲区

feof函数与ferror函数