假设我们已经打开了一个文本文件。是否可以定义指向文件中字符的指针? 如果是 - 文件中的以下字符是否会按照它们出现在文件中的相同顺序出现在内存中?
我问的原因:
我需要处理一个文本文件。我一次读一行,我想保留一些字符串。我读入的缓冲区总是会改变,所以我无法指向它。另一方面,我不想通过定义一个数组并将strcpy
文本文件中的字符放入其中来浪费空间。
我实际上想要访问一个文件,就像它是一个内存数组一样。
我只能使用C标准库函数。但无论如何,还要感谢其他建议。
答案 0 :(得分:6)
您可以复制您阅读的行,但这是不可接受的,因为您认为这会占用太多内存。
您可以使用mmap()
创建内存映射文件,但这是不可接受的,因为您需要与操作系统无关的内容。
您可以保留文件位置的动态记录,但由于您尚未真正阐明原因,这是不可接受的。
最后,您可以通过将文件拖入一个巨大的缓冲区来模拟内存映射文件,但是当(1)不是我的时候,这将是一个有效的解决方案。
总之,这些是您问题的所有可能解决方案。但是,由于您的要求过于严格,因此没有一个是令人满意的。
你的问题的答案是没有答案。
答案 1 :(得分:3)
答案 2 :(得分:1)
正如我所看到的那样,除非你愿意使用mmap,否则你的选择是复制字符串(以某些空间为代价)或在原始文件中记录字节位置,然后重新读取那些地方。除非你有充分的理由不这样做,否则我当然会选择前者。
答案 3 :(得分:1)
简短的回答是'不'。如上所述,您可以使用POSIX函数mmap或win32 CreateFileMapping。但是AFAIK如果文件要改变,它可以在你阅读的时候随时改变,所以最好的解决办法就是strcpy它。
编辑: C标准库中没有文件映射。所以现在你的选择 1)保持每个字符串在文件中的偏移(慢,但浪费很小的空间) 2)复制字符串(相对较慢的复制,然后即时访问它们,浪费更多的空间)。
但是,如果您知道在阅读之后必须保留哪些字符串,则只能在这些情况下更改缓冲区,并在可能的情况下重复使用它们。
答案 4 :(得分:0)
我不明白这些要求 - 您希望通过指针(即在内存中)保留一些字符串,但是您不希望通过为任务分配任何内存来“浪费空间”?
你反对的strcpy表现?如果是这样,为什么不在每次读取想要保留的行时分配新的缓冲区?显然你需要用保存的行跟踪以前的缓冲区......