You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取文件中被读取字符的存储地址?

获取文件中字符的存储地址:你需要知道的细节

首先直接给结论:标准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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:05:14