将fpos_t转换为int或char

4

我正在处理一个使用位运算的函数,该函数与文件的长度有关:fpos_t flen;

当我尝试将其转换为int或char,或对其执行算术运算时,它会失败并出现以下编译错误:error: aggregate value used where an integer was expected


1
fpos_t 是一个结构体,不是一个数字,请参见这里 - Seth Carnegie
@SethCarnegie 是吗?我正在处理别人的代码。现在我对自己正在处理的内容不太确定了... 如果你知道这个结构体的成员,请把它们列出来作为答案。 - sj755
1
fpos_t的类型是实现定义的 - 没有文档记录它。 它因平台而异。 您可以使用fgetpos()获取值,并将该值与fsetpos()一起使用,这就是全部内容; 其他所有内容都是无序的。(POSIX页面上回应了定义fpos_t的C标准,指出:_fpos_t:一个非数组类型,其中包含唯一指定文件中每个位置所需的所有信息_。) - Jonathan Leffler
非常好,设计得很清晰,可以防止您犯傻瓜错误,例如将文件位置强制转换为char或int。文件通常长于127或2GB字节。哪个 CRT 做到了这一点? - Hans Passant
2
如果您需要文件大小,请使用 stat()fstat() - Jonathan Leffler
3个回答

6
您误用了该类型。首先,它不代表长度,而是表示一个位置。其次,它只应在调用fsetpos时使用。您不应对其进行算术运算,因为它不一定代表数字类型。它包含库需要执行fsetpos操作的所有信息。在您的库实现中,fpos_t似乎是一个聚合类型,例如结构。 (您可以检查头文件中的定义来确保,但不要依赖您发现的任何内容;它可能在其他平台或以后版本的标准库中有所不同。)
至于下一步,考虑直接询问解决问题的更具体问题,当您想到在fpos_t上执行位运算的想法时。

我使用了gdb。在Linux(Fedora 15)中,有一个名为__pos的成员变量,它似乎保存了长度。我想也许作者最初就是这样想的。 - sj755
1
也许吧。但是不能保证__pos成员的含义与您或其他作者所认为的一致。 - Rob Kennedy
2
我问了给我代码的那个人。他说几年前在Solaris下使用时编译得很好。我在VMWare上安装了Solaris 11,编译了程序,并发现fpos_t是一个整数类型。换句话说,在Solaris上,fpos_t与Linux上的fpos_t.__pos是相同的。我已经修改了代码,使其编译成功,并发现它可以正常工作。 - sj755

3

当我尝试执行以下操作时,也遇到了同样的错误: char aux = (char)flen & 15,其中 flen 是 fpos_t 类型。 我在这里找到了解决方案:http://dsmarkchen.blogspot.com.br/2008/08/fpost.html。 应该改为: char aux = flen.__pos & 15。


1
再次提醒,这并不保证在每台计算机上都能正常工作(请参见上文)。 - rwst

2

听起来你想要使用当前文件位置作为整数进行操作。如果是这样的话,你可能会想要使用 ftell/fseek(或它们的 64 位版本),而不是 fgetpos/fsetpos。这两种方法都可以执行相似的操作,但是 ftell/fseek 使用整数值,而 fgetpos/fsetpos 使用一个有意抽象化的结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接