簡體   English   中英

編寫和讀取無符號字符到二進制文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM