gpt4 book ai didi

C: printf 中的 SEEK_END 显示意外值

转载 作者:行者123 更新时间:2023-11-30 19:54:03 28 4
gpt4 key购买 nike

当我使用SEEK_END时,我希望它对应于流中最后一个字符的位置。但在 printf 内部似乎没有。

我有一个包含 1010 个字符的文件。我用 fopen 打开它,然后尝试打印该文件最后一个字符的位置:

printf("Last position is: %d\n", SEEK_END);

输出是最后位置是:2,而我希望它是最后位置是:10102 不对应于最后一行或最后一列,因为我有 101 行,每行 10 个字符。我不知道那是什么。

奇怪的是,这段代码运行良好:

fseek(file, 0, SEEK_END);
printf("Last position is: %d\n", ftell(file));

输出为最后位置为:1010。但这里的问题是我正在文件中移动虚拟光标,这是我不想要的。

如何在不改变虚拟光标位置的情况下打印SEEK_END的值,更重要的是,为什么我的printf输出2

最佳答案

你有一个误会。 SEEK_END 并不是一个以某种方式存储您现在正在考虑的文件长度的神奇符号。它是一个常量,用作告诉 fseek() 对于指定文件偏移量使用哪个引用点的代码。

如果您想确定已知名称的文件的大小,并且您使用的是 POSIX 系统,那么您可以使用 fstat()。如果您拥有的只是一个 FILE *,那么您最好的选择可能是记录当前位置,查找流的末尾,确定位置,然后返回到起点:

fpos_t current;
long end;

/* error checks omitted for brevity */
fgetpos(file, &current);
fseek(file, 0, SEEK_END);
end = ftell(file);
fsetpos(file, &current);

printf("Last position is: %ld\n", end);

当然,这一切都取决于流是否可搜索。并非所有人都是。如果您有一个不可查找的流,那么很可能对其最后位置一开始就没有任何意义。

文件偏移量超过 long 的大小也存在潜在问题。 fgetpos()fsetpos() 预计对此不会敏感,但它们附带的 fpos_t 类型可能是聚合类型(即一个结构),因此不能直接询问。您可以使用 lseek() 解决这个问题,但它来自 POSIX,而不是标准 C。

关于C: printf 中的 SEEK_END 显示意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43810610/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com