2014-05-04 29 views
0

我正在嘗試使用fseek轉到文件中的特定位置並打印文本。但是,當我使用fputc或fwrite時,他們保持輸入十六進制值而不是char值。該文件是一個.dat文件,並最初填充0。所以除了這個,如果我嘗試寫入文件的其餘部分被刪除....我需要它保持不變,但用這個新文本覆蓋特定的位置。除此之外,爲什麼我的fseek每次只移動2個字節而不是1個?代碼:爲什麼我的fputc/fwrite繼續以十六進制打印,如何打印到文件的中間?

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

是否需要在Hex中,因爲它是一個.dat文件?這裏的每個0代表一個字節是否正確?如果char佔用一個字節,它不應該佔用一個點(假設Hex不是必需的)?

編輯:我意識到,如果我貓打印出來的字符。但是這是否意味着每兩個空格都被認爲是一個字節?

回答

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