2013-07-26 44 views
5

Tôi đang viết một chương trình đơn giản ghi vào một tệp nhị phân, đóng nó và sau đó đọc dữ liệu vừa được viết. Tôi đang cố gắng viết một mảng ký tự không dấu. Tôi đang gặp một số vấn đề trong khi đọc dữ liệu. Tôi không chắc chắn chính xác nếu tôi đang viết dữ liệu không đúng cách hoặc đọc sai. Khi tôi đọc dữ liệu tôi nhận được kết quả đầu ra của mình là: 5 bytes cho số byte được đọc, nhưng đầu ra tôi nhận được không giống như các giá trị tôi đã viết cho tệp.Viết và đọc các ký tự chưa ký thành tệp nhị phân

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"; 
+0

Bạn muốn viết bao nhiêu byte? – phoxis

+0

thử mảng này giá trị 'dữ liệu [5] = {'a', 'b', 'c', 'd', 'e'};' với mã của bạn mà không có typecase Tôi nghĩ rằng nghi ngờ của bạn sẽ rõ ràng beater. Bạn đang viết giá trị acsii bạn đang in giá trị ascii con được thèm muốn vào char-symbol –

Trả lời

7

Những gì bạn nhận được khi đầu ra cái thấy là các ký tự ASCII của các yếu tố của array

Typecast unsigned char đến int

Điều này sẽ cho kết quả mong đợi.

for(int i=0; i<5;i++) 
     cout<<(int)data2[i]<<" "; 
+1

* 'bạn nhận được như đầu ra nhìn thấy là ký tự ASCII' * có anh ta cũng đang viết giá trị ascii, viết' 5' thay vì char ''5 ''. chọn tốt POW! –

1

Kích thước data là 5 và sizeof (unsigned char) luôn luôn là 1 Vì vậy, bạn đã viết 5 byte. Kiểm tra sự trở lại của fwrite (số mục được đọc hoặc viết). Ngoài ra bạn đọc 5 byte do đó fread sẽ trở lại 5.

Theo C99 Mục 6.5.3.4 Khoản 3 và C11 Mục 6.5.3.4 Đoạn 4

Khi áp dụng cho một toán hạng mà có kiểu char, unsigned char hoặc char đã ký, (hoặc phiên bản đủ điều kiện), kết quả là 1. Khi áp dụng cho toán hạng có loại mảng, kết quả là tổng số byte trong mảng đó là . 88) Khi áp dụng cho toán hạng có cấu trúc hoặc loại công đoàn , kết quả là tổng số byte trong đối tượng như vậy, bao gồm cả đệm nội bộ và đuôi.

Mặt khác, mọi thứ bạn đang in sẽ không được hiển thị vì phạm vi số mà bạn đang in là phạm vi ASCII không thể in được. Chỉ định một cái gì đó cao hơn 32 hoặc bắt đầu một cái gì đó từ 65 để xem kết quả. Hoặc đơn giản là khởi tạo bằng 'A', 'b', vv

OR với mã hiện có, khi in để định kiểu để int cout<<int (data2[i])<<" ";

3

Những gì bạn thấy là hành vi hợp lệ và bình thường khi bạn in các ký tự không thể in được như ASCII - 5,10,15,20,25. Có vẻ khác khi chúng được in dưới dạng ký tự.Vì vậy, hoặc là bạn có thể thử với dàn diễn viên để int hoặc bạn có thể thử với in ký tự (char) như A, B, C, D, E

Mã của bạn có thể hành xử như mong đợi với,

1) Gán ký tự in,

unsigned char data[5]={'A','B','C','D','E'}; 

hoặc

2) đúc đầu ra để int,

for(int i=0; i<5;i++) 
     cout<< (int) data2[i]<<" "; 
2

Tôi đoán bạn có đầu ra với một số ký tự như 'dấu hiệu câu lạc bộ' và sau đó trên dòng tiếp theo bạn thấy 3 ký tự khác, phải không?

Nếu bạn kiểm tra bảng ASCII, thì ASCII 5, 10, 15, 20 và 25 giống như những gì được hiển thị trên màn hình. ASCII 10 là '\ n' char do đó ký tự thứ 2 của bạn từ mảng in ra trên dòng thứ 2 :)

Các vấn đề liên quan