[英]Writing and reading unsigned chars to binary file
我正在編寫一個簡單的程序,寫入二進制文件,關閉它,然后讀取剛剛寫入的數據。 我正在嘗試編寫一個無符號字符數組。 我在閱讀數據時遇到了一些問題。 我不確定我是在寫不正確的數據還是讀錯了。 當我讀取數據時,我得到的輸出為:讀取的字節數為5 bytes
字節,但是我得到的輸出與我寫入文件的值不同。
FILE *binFile = fopen("sample","wb");
unsigned char data[5]={5,10,15,20,25};
fwrite(data,sizeof(unsigned char),sizeof(data),binFile);
fclose(binFile);
unsigned char data2[5];
binFile = fopen("sample","rb");
int s = fread(data2,1,sizeof(data),binFile);
fclose(binFile);
cout<<s<<" bytes\n";
for(int i=0; i<5;i++)
cout<<data2[i]<<" ";
cout<<"\n";
您作為輸出看到的是array
元素的ASCII字符
Typecast unsigned char
to int
這將給出預期的輸出。
for(int i=0; i<5;i++)
cout<<(int)data2[i]<<" ";
當您打印ASCII - 5,10,15,20,25等不可打印的字符時,您看到的是有效和正常的行為。 當它們作為字符打印時看起來不同。 因此,您可以嘗試使用強制轉換為int,也可以嘗試使用可打印的字符(字符),如A,B,C,D,E
您的代碼可以按預期運行,
1)分配可打印字符,
unsigned char data[5]={'A','B','C','D','E'};
要么
2)將輸出轉換為int ,
for(int i=0; i<5;i++)
cout<< (int) data2[i]<<" ";
我猜你的輸出有一些像'俱樂部的標志',然后在下一行,你看到其他3個角色,對嗎?
如果檢查ASCII表,則ASCII 5,10,15,20和25與屏幕上顯示的相同。 ASCII 10是'\\ n'字符,因此數組中的第二個字符在第二行打印輸出:)
Sizeof data
為5, sizeof (unsigned char)
始終為1因此您寫了5個字節。 檢查fwrite
的返回(讀取或寫入的項目數)。 你也讀了5個字節,因此fread
將返回5。
根據C99第6.5.3.4節第3段和第C11節第6.5.3.4節第4段
當應用於具有char,unsigned char或signed char(或其限定版本) 類型的操作數時,結果為1. 當應用於具有數組類型的操作數時,結果是數組中的總字節數。 88)當應用於具有結構或聯合類型的操作數時,結果是此類對象中的總字節數,包括內部和尾部填充。
另一方面,無論您打印的是什么,都不會顯示,因為您打印的數字范圍是不可打印的ASCII范圍。 分配高於32的東西或從65開始查看結果。 或者只是使用'A','b'等初始化。
OR與現有代碼,當打印類型轉換為int cout<<int (data2[i])<<" ";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.