2011-12-29 29 views
5

Cho đến nay tôi có mã để đọc một char unsigned từ ifstream:Làm thế nào tôi có thể đọc và viết ký tự chưa được ký cho các tệp có fstream bằng C++?

ifstream in; 
unsigned char temp; 

in.open ("RANDOMFILE", ios::in | ios::binary); 
in.read (&temp, 1); 
in.close(); 

Đây có phải là đúng? Tôi cũng đã cố gắng để viết một char unsigned một ofstream:

ofstream out; 
unsigned char temp; 

out.open ("RANDOMFILE", ios::out | ios::binary); 
out.write (&static_cast<char>(temp), 1); 
out.close(); 

Nhưng tôi nhận được lỗi sau để viết:

error C2102: '&' requires l-value 

Và lỗi này để đọc:

error C2664: 'std::basic_istream<_Elem,_Traits>::read' : cannot convert parameter 1 from 'unsigned char *' to 'char *' 

Nó sẽ được đánh giá cao nếu ai đó có thể cho tôi biết những gì sai với mã của tôi hoặc làm thế nào tôi có thể đọc và viết ký tự chưa ký từ fstream.

Trả lời

8

Lỗi ghi cho bạn biết rằng bạn đang dùng địa chỉ tạm thời được tạo bởi static_cast.

Thay vì:

// Make a new char with the same value as temp 
out.write (&static_cast<char>(temp), 1); 

Sử dụng cùng một dữ liệu đã có trong tạm thời:

// Use temp directly, interpreting it as a char 
out.write (reinterpret_cast<char*>(&temp), 1); 

Các đọc lỗi cũng sẽ được cố định nếu bạn nói với trình biên dịch để giải thích các dữ liệu như một char :

in.read (reinterpret_cast<char*>(&temp), 1); 
2

Hàm alays lấy byte làm đối số, được biểu diễn bằng các giá trị char để thuận tiện. Bạn có thể truyền con trỏ đến các byte này bao nhiêu tùy thích, do đó,

in.read (reinterpret_cast<char*>(&temp), 1); 

sẽ đọc một byte đơn thuần. Hãy nhớ rằng bộ nhớ là bộ nhớ là bộ nhớ, và các loại C++ chỉ là một giải thích của bộ nhớ. Khi bạn đang đọc byte thô thành bộ nhớ thô (như với read), bạn nên đọc trước và sau đó truyền tới loại thích hợp.

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