有没有fseek/ftell可以提供错误文件大小的情况?

Ale*_*lds 4 c c++ porting fseek ftell

在C或C++中,以下内容可用于返回文件大小:

const unsigned long long at_beg = (unsigned long long) ftell(filePtr);
fseek(filePtr, 0, SEEK_END);
const unsigned long long at_end = (unsigned long long) ftell(filePtr);
const unsigned long long length_in_bytes = at_end - at_beg;
fprintf(stdout, "file size: %llu\n", length_in_bytes);
Run Code Online (Sandbox Code Playgroud)

是否有基于填充或特定情况的其他信息,可以从此代码返回错误文件大小的开发环境,编译器或操作系统?在1999年左右,C或C++规范是否有变化,这会导致此代码在某些情况下不再起作用?

对于这个问题,请假设我通过使用标志进行编译来添加大文件支持-D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1.谢谢.

Bas*_*tch 6

它不会对unseekable文件的工作像/proc/cpuinfo/dev/stdin/dev/tty或得到与管道文件popen

如果该文件由另一个进程同时写入,它将无法工作.

使用Posix stat函数可能更有效,更可靠.当然,非Posix系统可能无法使用此功能.