fpos_t类型变量的格式说明符?

时间:2016-09-20 07:16:18

标签: c file

这里我只想查看变量pos的内容;那么什么类型的格式说明符必须用于此?

#include <stdio.h>

void main() {
    FILE *fileptr = fopen("sample.txt", "r+");
    fpos_t pos;
    int val = fgetpos(fileptr, &pos);
}

3 个答案:

答案 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;
}

如果您有其他要求,请告诉我,我们将很乐意为您提供进一步的帮助。