2014-01-05 120 views
-1

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

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

回答

2

有一些东西叫做memory mapped file,但是除此之外,你可以实现你想要的(如果我正确地理解它),只需打开文件并将其加载到缓冲区中(这是从文件中读取数据的常用方式)。

一旦进入内存,您访问的第一个字节为*buf,第二个为*(buf+1)依此类推;或者,因为更清晰,通常会更好,buf[0],buf[1]等等。

为什么你不能使用内存映射文件?因为当你用C语言打开一个文件(使用fopen)时你有什么是一个不透明的指针(即指向未知的数据的指针,你必须将其视为一个“概念”,而不是你可以读取的实际数据),允许其他函数(fread,fwrite,fseek等)在打开的文件上“运行”,但该指针不“包含”文件的字节。它有时被称为处理程序出于某种原因:它使它有可能“处理”该文件。

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

0

我想你是在C语言环境中谈论。不,该文件实际上并未存储在内存中。考虑文件指针,例如作为一个指针/箭头,它显示了你在阅读该文件的过程中有多远。这意味着,如果您现在执行读取操作,则指针会告诉您将从该文件读取哪个char/int等,即您当前在哪里读取该文件。这是指针的用途。这是我粗略和非正式地解释这一点的方式。

+0

但我期望文件被加载到内存中,因为我知道它必须在执行前加载到内存 –

0

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

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

0

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

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

什么意思,甚至有“指向文件”?你看,ptr+1扫描文件并不是一个很好的选择,原因很多。如果它是二进制数据,那么您对ptr+1有何期待?如果你想阅读更大的数据块,比如一次一行?

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

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