这里我只想查看变量pos
的内容;那么什么类型的格式说明符必须用于此?
#include <stdio.h>
void main() {
FILE *fileptr = fopen("sample.txt", "r+");
fpos_t pos;
int val = fgetpos(fileptr, &pos);
}
答案 0 :(得分:5)
fpos_t
在C标准中定义为:
fpos_t
这是一个完整的对象类型,而不是一个数组类型,能够记录唯一指定文件中每个位置所需的所有信息。
此类型不一定是标量,可以定义为具有多个成员的struct
。没有printf
格式以可读的方式输出它。某些系统可能需要执行复杂的任务来处理文本文件,并非每台计算机都是PC 。
如果您对实现感兴趣,可以将其内容转储为十六进制字节:
#include <stdio.h>
int main(void) {
FILE *fileptr = fopen("sample.txt", "r+");
fpos_t pos;
if (fileptr && fgetpos(fileptr, &pos) == 0) {
printf("contents of pos: ");
for (size_t i = 0; i < sizeof(pos); i++) {
printf("%02X", ((unsigned char *)&pos)[i]);
}
printf("\n");
}
return 0;
}
在许多现代系统中,您将得到0000000000000000
,因为64位整数足以表示文件偏移量所需的所有信息,但您不应该依赖于此。
答案 1 :(得分:3)
fpos_t
故意是一个不透明的结构。
此外,C标准没有定义检查其内容的方法(您在Java等其他语言中看不到toString()
无意义。
因此,如果你想要一个便携式解决方案,那么你就不走运了。
如果是在特定平台上进行调试,那么你可能能够找出它的内容(通常它包含一个指定不超过字节数的整数类型),并且输出相应。
答案 2 :(得分:-1)
如果我理解了您的问题并且您只想知道代码中pos
的价值,那么大多数文件中的位置可以很容易地在x86_64上表示为long
值,或者表示为{{在x86上1}} (实际上long long
的声明是ftell
基本上文件位置可以安全地用64位整数值表示。(你应该检查你的文件是否可以超过 9223372036854775807 < / em> bytes)如果您有64位计算机,则可以执行以下简单操作。
代码将返回命令行上给出的文件大小(如果没有给出参数,则返回默认值long ftell(FILE *stream);
,根据系统需要调整默认值)
file.txt
示例使用/输出
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv) {
long pos = 0; /* f_pos can be represented as a long */
char *fn = argc > 1 ? argv[1] : "wii-u.txt";
FILE *fp = fopen (fn, "r");
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", fn);
return 1;
}
fseek (fp, 0, SEEK_END); /* move file pos indicator to end */
if ((pos = ftell (fp)) == -1) { /* get file length */
fprintf (stderr, "error: unable to determine file length.\n");
return 1;
}
fseek (fp, 0, SEEK_SET); /* reset to beginning of file */
printf (" file '%s' : %ld - bytes\n", fn, pos);
if (fp != stdin) fclose (fp); /* close file if not stdin */
return 0;
}
如果您有其他要求,请告诉我,我们将很乐意为您提供进一步的帮助。