如何获取文件中被读取字符的存储地址?
获取文件中字符的存储地址:你需要知道的细节
首先直接给结论:标准C语言没有提供可移植的方法来获取字符在磁盘上的物理存储地址——这是因为标准库刻意抽象了文件系统的底层细节,让你不用关心数据实际存在磁盘的哪个扇区或块。不过我们可以分两种情况来解决你的需求:
情况1:你需要的是文件内的逻辑偏移(最常见需求)
如果你说的“对应文件中字符的地址”指的是这个字符在文件里是第几个字节(从文件开头算起的逻辑位置),那完全可以用标准库的ftell()函数来实现。
先修正你原代码里的一个常见错误:while (!feof(fr))的写法会导致最后多读一次EOF,正确的做法是先读取字符,再判断是否为EOF。下面是调整后的示例代码:
#include <stdio.h> #include <stdlib.h> int main() { FILE *fr; int ch; // 注意要用int类型,因为fgetc返回int(包含EOF的特殊值) long char_offset; fr = fopen("text.txt", "r"); if (fr == NULL) { perror("Failed to open file"); return EXIT_FAILURE; } // 正确的读取循环:先读,再判断是否为EOF while ((ch = fgetc(fr)) != EOF) { // ftell返回的是下一个要读取的字符的偏移,所以当前字符的偏移要减1 char_offset = ftell(fr) - 1; printf("Character '%c' is at logical offset %ld\n", (char)ch, char_offset); putchar(ch); } fclose(fr); return EXIT_SUCCESS; }
这里的char_offset就是该字符在文件内的逻辑位置,这也是大多数场景下你真正需要的“地址”。
情况2:你真的需要磁盘上的物理存储地址
如果你的需求是获取这个字符在磁盘硬件上的实际物理位置(比如哪个扇区、哪个块),那标准C帮不了你——这属于操作系统和文件系统的底层细节,需要依赖特定平台的API:
- Linux/Unix:可以使用
ioctl()配合FIEMAP命令来获取文件的物理块映射,不过这个操作通常需要root权限,而且代码完全不可移植。 - Windows:可以调用
DeviceIoControl()并传入FSCTL_GET_RETRIEVAL_POINTERS参数来获取文件的物理存储信息,同样是Windows特有的。
要注意:绝大多数应用程序根本不需要关心物理地址,文件系统会自动管理数据的存储位置,直接使用逻辑偏移就足够了。
内容的提问来源于stack exchange,提问作者Masaki Andooh
相关产品推荐
相关产品推荐

