为什么我的fputc / fwrite会以十六进制打印,如何打印到文件中间?

时间:2014-05-04 20:01:54

标签: c hex fopen fseek fputs

我正在尝试使用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文件,是否需要使用Hex格式?这里每0表示一个字节是否正确?如果一个字符占用一个字节不应该占用一个点(假设不需要Hex)?

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

1 个答案:

答案 0 :(得分:1)

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

如果使用调试器查看文件的内容,调试器可能会在< Hex;&#39 ;;在这种情况下,它会显示一对代表一个字节的十六进制数字。

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

在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