-1

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

Hello World
fantastic

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

4

4 回答 4

3

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

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

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

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

于 2014-01-05T16:11:57.633 回答
0

I think you're talking in the context of the C language. No, the file is not actually stored in memory. Think of the file pointer e.g. as a pointer/arrow which shows you how far you're in the process of reading of that file. This means, if you now do a read operation, the pointer tells you which char/int etc. you will read from this file i.e. where you are currently in it. This is what the pointer is for. This is my way of roughly and informally explaining this.

于 2014-01-05T15:38:30.037 回答
0

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

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

于 2014-01-05T16:07:10.687 回答
0

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

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

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

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

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

于 2014-01-05T16:07:37.910 回答