文件指针或流指针背后的概念是什么?

时间:2014-01-05 15:33:46

标签: c file file-pointer

我知道指针是一个存储另一个变量地址的变量。所以我理解了char类型指针,整数类型指针的概念,当我们向指针添加一个时会发生什么等等。但是我没有得到文件指针背后的真实概念。为什么我们不能像在字符数据类型的情况下那样直接指向它们?例如,考虑一个包含内容的文件:

Hello World
fantastic

让'ptr'指向此文件。为什么我们不能使用技术ptr指向'H',(ptr + 1)到'e',(ptr + 2)到'l'等等。如果我的问题是愚蠢的,原谅有时我会理解真正的概念。我认为这个文件实际上存储在内存中,就像字符串存储在内存中一样。 (我知道fscanf()函数和所有)

4 个答案:

答案 0 :(得分:2)

有一些名为memory mapped file的东西,但除此之外,您可以实现您想要的(如果我理解正确)只需打开文件并将其加载到缓冲区(这是一种常见的阅读方式)文件中的数据。)

进入内存后,您使用*buf访问第一个字节,使用*(buf+1)访问第二个字段,依此类推;或者,通常更清楚,使用buf[0]buf[1]等等。

如果您不使用内存映射文件,为什么不能?因为你在C中打开一个文件(使用fopen)时所拥有的是一个不透明的指针(即指向你不知道的数据的指针,你必须将它视为一个“概念”而不是你能读到的实际数据允许其他函数(fread,fwrite,fseek等)对你打开的文件进行“操作”,但该指针不“包含”文件的字节。它有时被称为 handler ,原因是:它可以“处理”文件。

使用该不透明指针FILE*,您可以从内存中读取该文件中的字节,然后您可以处理内存中的数据。

答案 1 :(得分:0)

我认为你在C语言的背景下谈论。不,文件实际上并未存储在内存中。想想文件指针,例如作为指针/箭头,显示您在阅读该文件的过程中的距离。这意味着,如果您现在执行读取操作,指针会告诉您将从此文件中读取哪个char / int等,即您当前所在的位置。这是指针的用途。这是我粗略和非正式地解释这一点的方式。

答案 2 :(得分:0)

我认为我不希望ptr + 1给我文件的第二个字符的基本原因是,在C中,指针算术会移动一个对象,而不是一个字节;所以我希望ptr + 1指向“下一个”文件,无论这意味着什么(如果有的话)。

文件通常存储在磁盘上,而不是存储在内存中。

答案 3 :(得分:0)

文件未存储在内存中。打开它时,它可以被带入内存(或部分内存)。文件不是程序数据的一部分,它们只是您可以在操作系统的帮助下使用的实体。

与内存中的常规字符数组相比,文件背后有很多。读取和写入文件通常是缓冲的,这由标准C库FILE结构处理,允许您调用文件上的操作。

甚至意味着拥有“指向文件的指针”?你看,由于很多原因,ptr+1扫描文件并不是一个好的选择。如果是二进制数据,您对ptr+1的期望是什么?如果您想要读取更大的数据块,例如一次一行,该怎么办?

正如您所看到的,这个选择有几个原因,主要原因是文件没有像常规变量那样在程序的地址空间中存储在内存中。描述文件和光标位置的结构是最常用的方法。

需要注意的另一个要点是ptr+1的语义仅对语言内置类型有意义。文件不是内置类型,没有意义。