【问题标题】:Is it possible to define a pointer to a character inside a text file?是否可以在文本文件中定义指向字符的指针?
【发布时间】:2009-07-26 13:05:41
【问题描述】:

假设我们打开了一个文本文件。是否可以定义指向文件中字符的指针? 如果是 - 文件中的以下字符是否会按照它们在文件中出现的顺序出现在内存中?

我问的原因:
我需要处理一个文本文件。我一次读一行,我想保留某些字符串。我读入的缓冲区总是会发生变化,所以我不能保留指向它的指针。另一方面,我不想通过定义一个数组和strcpy将文本文件中的字符放入其中来浪费空间。

我实际上想像访问内存数组一样访问文件。

编辑:

我只能使用 C 标准库函数。不过还是感谢其他建议。

【问题讨论】:

  • 您为什么不发布实际作业,以便我们有机会满足这些空洞的标准?
  • 哦,你不会想要的。这实际上是一个项目,要求有 30 页长,我不会将其翻译成英文。此外,这个问题来自我在设计中做出的决定,而不是在需求中明确表达的东西。

标签: c file pointers


【解决方案1】:
  1. 您可以复制您阅读的行,但这是不可接受的,因为您认为这会占用太多内存。

  2. 您可以使用mmap() 创建内存映射文件,但这是不可接受的,因为您需要独立于操作系统的文件。

  3. 您可以保留文件位置的动态记录,但由于您尚未真正阐明的原因,这是不可接受的。

  4. 最后,您可以模拟 将文件放入一个巨大的缓冲区中来模拟内存映射文件,但是当 (1) 不是时,这将是一个有效的解决方案。

总的来说,这些是解决您问题的所有可能解决方案。但是,它们都不令人满意,因为您的要求太严格了。

你的问题的答案是没有答案。

【讨论】:

  • 有答案。使用 C 标准库,我无法将打开的文件视为内存数组。
  • 定义“将打开的文件视为内存数组”。我看不出 seek+read 如何不符合这些标准。
【解决方案2】:

你想达到什么结果?

如果您想像访问内存数组一样访问文件,可以使用内存映射文件来实现。

mmap 是执行此操作的 POSIX 函数。

【讨论】:

  • 我需要独立于操作系统的东西。
  • Apache Portable Runtime 提供了独立于操作系统的功能。例如,apr_mmap() 执行 mmap。
  • 好吧,您可以将 POSIX 上的 mmap 和 MapViewOfFile 包装到您自己的抽象中,涵盖最流行的平台。可能已经有这样的包装器了(也许是提升?)
  • 谢谢。这是学校的作业。我只能使用 C 标准库。
【解决方案3】:

在我看来,除非您愿意按照这里的建议使用 mmap,否则您的选择是复制字符串(以一些空间为代价)或记录原始文件中的字节位置,然后从那些位置。我当然会选择前者,除非你有充分的理由不这样做。

【讨论】:

  • 我已经考虑过记录偏移量并使用 fseek,但谢谢。
  • 如果文件长度为 n 字节会更好,但代价是 O(n/2)。
  • 那么你只需要复制字符串
【解决方案4】:

简短的回答是“不”。如此处所述,您可以使用 POSIX 函数 mmap 或 win32 CreateFileMapping。但是 AFAIK 如果文件要更改,它可能会在您阅读时随时更改,因此最好的解决方案可能是 strcpy 它。

编辑: C 标准库中没有文件映射。所以你现在的选择是 1)保持文件中每个字符串的偏移量(速度慢,但浪费空间小) 2)复制字符串(相对较慢的复制,然后立即访问它们,浪费更多空间)。

但是,如果您知道在阅读后必须保留哪些字符串,则只能在这些情况下更改缓冲区,并尽可能重复使用它们。

【讨论】:

    【解决方案5】:

    我不明白这些要求 - 您想保留一些可通过指针访问的字符串(即在内存中),但又不想通过为任务分配任何内存来“浪费空间”?

    是你反对的 strcpy 性能吗?如果是这样,为什么不在每次读取要保留的行时分配一个新缓冲区?显然,您还需要使用保存的行来跟踪以前的缓冲区...

    【讨论】:

    • 没有。我不。我只需要保存当前处理行的缓冲区,如果其中有一个我想保留的字符串,我应该将它 strcpy 到分配的空间中。无需为每一行分配一个新的缓冲区。
    • 好吧,这正是您应该做的,但这就是您在问题中将其视为“浪费空间”的原因。这真的没有多大意义。
    • 如果可以像我描述的那样定义一个指针,那将是有意义的。
    猜你喜欢
    • 2021-10-15
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多