30/09/2018, 23:16
Vấn đề với reinterpret_cast trong c++ khi đọc ghi file nhị phân?
mình có đoạn ct ghi file nhị phân như sau
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
void ghi(string, string);
int main(){
string str = "test";
ghi("output.dat", str);
system("pause");
return 0;
}
void ghi(string name,string str){
ofstream ghi(name, ios::binary);
ghi.write(reinterpret_cast <char *> (&str), sizeof(str));
cout << "Write data finished" << endl;
ghi.close();
}
và đọc như sau
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void doc(string);
int main(){
string name = "output.dat";
doc(name);
system("pause");
return 0;
}
void doc(string name){
ifstream doc(name, ios::binary);
if (!doc){
cout << "File not found" << endl;
return;
}
string str;
doc.read(reinterpret_cast <char *> (&str), sizeof(str));
doc.close();
cout << str << endl;
}
nhưng khi chạy ct đọc,nó đọc đúng, nhưng có 1 lỗi hiện thị như sau
lỗi là do đâu nhỉ, mình thấy nghi vấn chỗ doc.read(reinterpret_cast <char *> (&str), sizeof(str));
bản chất string là 1 vector, giờ chuyển nó về con trỏ kiểu char có vấn đề gì k ta?
Bài liên quan
doc.read(str.data(), sizeof(str));
như này hả bạn?
mình đã thử cả str.c_str() mà cũng k được
nhưng mà đọc ghi file nhị phân,
prototype của phương thức write và read
(buff, n)
n là số byte của dữ liệu muốn ghi vào, nên mình dùng sizeof để lấy kích thước dữ liệu muốn ghi vào
buff là 1 con trỏ kiểu char, hoặc địa chỉ của 1 kí tự char
nếu dùng phương thức size() hoặc length() thì nó lại trả về số phần tử của str
thì cũng như sizeof cả
string str = “abcd”;
str.size() ; = 4;// k tính null
sizeof(str) = 4; // k tính null
với lại dùng phương thức data() như bạn nói thay cho casting không được, bị lỗi
haizad, thảo luận với bạn hay thật?
thứ 1, về cuộc sống
giả sử như mình đang sai , và mình lên đây hỏi, mục đích là để tìm ra lỗi sai,rồi mình mới sửa, chứ k phải tìm cái đúng của ng khác rồi mình mang về thay cái sai của mình,
trường hợp này mình hỏi, nếu bạn biết, bạn có thể chỉ ra lỗi sai của mình rồi mới chỉ ra phương án thay thế, hơn là cứ bảo mình dùng cái này cái nọ, trong khi những gì mình làm là mình đọc trong tài liệu, nghĩa là nó có cở sở chứ k phải mình làm bừa, và giờ mình k thực hiện được, vấn đề của mình là mình cần tìm ra cái sai, chứ bây giờ mình k cần tìm ra cái đúng, lập trình là quá trình đúc rút kiến thức qua các giai đoạn, biết, đọc, hiểu, áp dụng, sai, sửa sai -> đúng -> kinh nghiệm, chứ k phải là quá trình
sai, tìm cái đúng, thay vào cái sai, k quan tâm cái sai kia là ở chỗ nào
thứ 2, về kiến thức
như bạn thấy mình nói prototype của phương thức read và write file nhị phân trong c++ là
read(buff, n);
write (buff,n);
buff là con trỏ char,( trỏ tới vùng nhớ dữ liệu cần ghi vào), hoặc là địa chỉ của 1 biến char , ngoài ra các kiểu khác thì phải ép kiểu đưa nó về con trỏ char
n là số byte cần ghi vào
trương hợp này mình ghi vào file nhị phân 1 string,
và mình dùng sizeof() để lấy về kích thước của biến str này, cũng tương tự như dùng size hoặc lenght, như đã giải thích ở bình luận trên, về logic mà nói dùng sizeof đúng tính chất hơn
vì buff là 1 con trỏ char, nên mình cần ép kiểu,
như bạn nói là dùng phương thức data() mình đã thử và k được, đã thử c_str(), cũng k được
và bạn nói là mình làm màu code? cái này là mình học trong tài liệu, k hiểu ý làm màu của bạn là gì, khi mà code của mình nó rất đơn giản, chỉ là ép kiểu bình thường
mình thấy bạn như đang bắt nạt mình vậy, chứ k đúng nghĩa 1 cuộc thảo luân để chia sẻ học hỏi kiến thức
và mình đang học tìm tòi , chứ k phải là code để cho ng khác chấm, hay thầy chấm, nên tư tưởng của mình là tìm ra bản chất của vấn đề chứ k phải chỉ mỗi tìm phương án cho vấn đề đang làm
@nguyenchiemminhvu như bạn nói thì bạn nói, thì bạn có thể chỉ ra lỗi sai của mình không, và sửa ntn, cách của bạn là gì, mình dùng phương thức data() như bạn nói vẫn k được, đọc ntn mới đúng?
32 là bạn lấy đại thế hay sao?
việc chỉ ra sô byte cần sao chép như bạn
doc.read(temp, 100);
không làm được,ct không lỗi, nhưng k có kết quả
trương hợp trong ví dụ của bạn, file toàn là string , và cần đọc hết cả 1 lần hoặc từng câu, nên bạn dùng fseek di chuyển con trỏ file để lấy số lượng byte cần đọc, nhưng nếu 1 file mà có nhiều dữ liệu hỗn hợp
ví dụ 1 dòng số thực
1 số nguyên
xen lẫn 1 str,
các số thực lại cần lấy ra các biến khác nhau, lúc này mà kiểm tra số byte cần đọc như thế là rất khó và dài
với cái ép kiểu kia là cần thiết
vì phương thức đọc và ghi nhị phân đối số vào là 1 con trỏ kiểu char ( để tổng quát)
vậy bây giờ cần ghi 1 số nguyên, số thực, mảng số nguyên thì cần ép kiểu về con trỏ char cả mà