Giúp tìm lỗi đoạn code C++ thao tác với file bị sai dữ liệu không tìm được nguyên nhân?
Chào các bạn. Mình có 1 đoạn code như bên dưới. Đoạn code này sẽ lưu dữ lieu một bức ảnh từ camera xuống file binary rồi đọc trở lại nhưng gặp lỗi không tìm được nguyên nhân.
// đọc dữ lieu từ camera
Camera::getLastFrame();
cv::Mat* img_raw = Camera::RawImage;
// đoạn code test copy
//for (int i = 0; i < 6220800; i++) img_restore->data[i]=img_raw->data[i];
// lưu xuống file.
//mảng dữ lieu của ảnh được trỏ bởi con trỏ data (unsigned char*), độ dài dữ lieu là 6220800 byte (ảnh full HD BGR)
std::fstream filesave;
filesave.open("Programs\Test.aoi", std::ios::out);
filesave.write((char*)img_raw->data, 6220800);
filesave.close();
// nghi ngờ lỗi do máy tính chưa kịp lưu nên đã delay nhưng không có tác dụng
//System::Threading::Thread::Sleep(800);
// đọc dữ lieu từ file vào vùng dữ lieu ảnh của ảnh restore.
std::fstream fileread;
fileread.open("Programs\Test.aoi", std::ios::in);
fileread.read((char*)img_restore->data, 6220800);
fileread.close();
// hiển thị ảnh restore
ShowImage(img_restore);
Hiện trạng lỗi như sau:
Nếu chỉ chạy đoạn code test copy trực tiếp từ img_raw sang img_restore thì ảnh restore hiển thị OK như sau:
Tuy nhiên nếu bỏ đoạn test copy và chạy đoạn code save / read thì ảnh sau khi restore bị sai. Nó going như khi xem đĩa bị vấp hình.
Có một chi tiết them là nếu mình chỉnh sửa vào tất cả các byte của dữ liệu ảnh img_raw thì ảnh sau khi đọc lại đúng.
Khích lệ các anh em sẽ có 50K thẻ nạp cho ai có solution
Hi Văn Dương
Có thể img_raw của bạn là vùng nhớ buffer mà camera đẩy vào. Bạn cần copy nó ra một vùng nhớ khác để lưu xuống.
Vùng nhớ này của camera nhưng chỉ được update khi mình ra lệnh cho camera read thôi. Đây là mình đơn giản hoá ý tưởng thôi. Mình có copy ra nhưng vẫn bị như vậy.
Hi Văn Dương,
P/S Bạn có thể lưu thành file PPM và đọc lện bằng tool khác để kiểm tra.
thử thêm flag binary cho stream xem:
thêm chi tiết nữa là C++ đừng xài C style cast
(char*)
mà xài C++static_cast
:Thực tế mình sẽ lưu ảnh khác chứ không phải của camera. Ảnh camera chỉ tượng trưng thôi. Mình đã kiểm tra đến sau bước lưu thì dữ liệu ảnh raw vẫn đúng.
Kiểm tra dung lượng file chính xác.
Mình có xem binary của file tương đối chính xác, chỉ tương đối vì file lưu lượng lớn mình chỉ check sơ bộ bằng tool tự viết.
Mình sẽ check kỹ hơn xem sao.
Mình quên mất ios::binary.
Để mai mình kiểm tra lại. Hôm nay về nhà mất rồi
Cảm ơn @Phong_Ky_Vo và @tntxtnt đã trợ giúp.
Mình đã test lại và lỗi là do thiếu std::ios::binary option trong khi mở file.
Tìm hiểu them mình được biết là do thiếu ios::binary nên trong lượng dữ lieu rất lớn của mình rất dễ gặp các đoạn dữ lieu đặc biệt như '\n", “\r”… và nó sẽ bị xử lý trước khi lưu file và đọc file làm dữ lieu thu được bị hỏng.
Solution là của bạn @tntxtnt. Bạn inbox cho mình số điện thoại để mình thực hiện lời hứa nhé.
Còn một vấn đề nhỏ mình nhờ các bạn chỉ giáo đỡ phải mở chủ đề mới.
Mình có 2 object, một object chứa một function pointer, một object khác chứa một method. Mình sẽ gán như thế nào để 2 đứa “qua lại” với nhau.
thôi có thiếu mỗi cái binary flag mà 50k gì =)
câu hỏi mới khó quá, lập thớt khác đi
dễ nhất là xài C++11
std::function
, nhưng mà nó chậm, ko biết chậm bao nhiêu, nếu hàm này gọi 1 2 lần chứ ko phải gọi 10000 lần thì ok:cách khác ko xài C++11, hơi bị sai sai vì
Callback
bị gắn chết là B method :VHI Văn Dương.
Trong lớp A có 1 con trỏ lớp B. Khi gọi hàm của A thì gọi lại hàm của B.
cái này gọi là pimpl (pim pồ), muốn cho nó đúng với mọi hàm thì nó hơi bị phức tạp 1 tí vì vướng mấy cái const :V http://en.cppreference.com/w/cpp/language/pimpl
ví dụ:
cần phải xài thêm
std::experimental::propagate_const
: http://coliru.stacked-crooked.com/a/0e8c8cce1333b5fc, mà cái này compiler có compiler ko :VMình đã ăn hành với cái lỗi này suốt 1 ngày trong khi deadline sát đít. Nên cái flag nó có ý nghĩa không nhỏ.
Đừng ngại nhé, inbox để mình thực hiện lời hứa (tại dung bankplus phải có sđt để chuyển tiền )
Vấn đề mình nhờ về sau là nó như hình này:
Bên trái là style của C. Tức là Function pointer và method là static. Và nó chạy.
Còn bên phải là style C++. Khác ở chỗ function pointer và method được di chuyển vào 2 object. Nhưng lỗi.
Mình muốn làm giống delegate trong C#.
Mở rộng ra là làm going event của C#.
Hi Văn Dương.
stackoverflow.com
What is a C++ delegate?
Cơ bản thì nó là một dạng đa hình bạn coi các phương thức là dối tượng.
P/S Code của bạn lỗi vì hàm đí là phương thức của đối tượng.