0

我正在尝试使用 fseek 转到文件中的特定位置并打印文本。但是当我使用 fputc 或 fwrite 时,它​​们会继续输入 Hex 值而不是 char 值。该文件是一个 .dat,最初用 0 填充。因此,除此之外,如果我尝试在某处写入文件的其余部分,则文件的其余部分将被删除......我需要它保持不变,但这个新文本会覆盖该特定位置。除此之外,为什么我的 fseek 一次移动 2 个字节而不是 1 个字节?代码:

    FILE * pF;
pF = fopen( "/home/caleb/Documents/PA3/dssoo_p3_material_v2/disk.dat" , "wb" );
fseek (pF, 4, SEEK_SET);
char c='c';
fputc(c, pF);
//char buffer[] = { 'x' , 'y' , 'z' };
//fwrite (buffer , sizeof(char), sizeof(buffer), pF);
fclose (pF);

注意 fwrite 在这里被注释掉了。我还尝试了 fopen 中除 wb 之外的其他值。我得到:0000 0000 63

由于它是 .dat 文件,是否需要使用十六进制?这里的每个 0 都代表一个字节对吗?如果一个字符占用一个字节,它不应该能够占用一个位置(假设不需要十六进制)?

编辑:我已经意识到,如果我 cat 它会打印出角色。但这是否意味着每两个空格都被视为一个字节?

4

1 回答 1

1

0x64 = 'c' = 99(十进制)。“字节”值是相同的,以不同的方式表示。

如果使用调试器查看文件的内容,调试器可能会以“十六进制”向您显示数据;在这种情况下,它将显示一对代表一个字节的十六进制数字。

(是的,'在十六进制中,每对字符都是一个字节。)

在 C 中,您可以打印出以各种方式表示的字节值:

printf("%d", 0x63);  // will print out: 99
printf("%X", 0x63);  // will print out: 63
printf("%c", 0x63);  // will print out: c

printf("%d", 99);  // will print out: 99
printf("%X", 99);  // will print out: 63
printf("%c", 99);  // will print out: c

printf("%d", 'c');  // will print out: 99
printf("%X", 'c');  // will print out: 63
printf("%c", 'c');  // will print out: c
于 2014-05-04T20:47:36.327 回答