【问题标题】:What is the concept behind file pointer or the stream pointer?文件指针或流指针背后的概念是什么?
【发布时间】:2014-01-22 23:56:08
【问题描述】:

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

Hello World
fantastic

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

【问题讨论】:

    标签: c file file-pointer


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 但是我希望文件被加载到内存中,因为我知道它必须在执行之前加载到内存中
          猜你喜欢
          • 2014-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-15
          • 1970-01-01
          • 2011-05-19
          相关资源
          最近更新 更多