2013-02-25 31 views
6

Tôi đang cố mở một tệp đầu ra nhị phân mà tôi cần để nối thêm một số dữ liệu. Tôi không thể xuất dữ liệu tuần tự, vì vậy tôi cần có khả năng tìm kiếm trong luồng tệp và không thể sử dụng cờ std::ios::app.Mở một luồng tập tin đầu ra nhị phân mà không cắt ngắn

Thật không may, khi mở luồng tệp đầu ra mà không có cờ std::ios::app, tệp sẽ bị cắt bớt khi nó được mở. Dưới đây là một số mã mẫu:

#include <iostream> 
#include <fstream> 

int main() { 
    std::ofstream file("output.bin", std::ios::binary | std::ios::ate); 

    std::streamoff orig_offset = file.tellp(); 
    std::cout << "Offset after opening: " << orig_offset << std::endl; 

    file.seekp(0, std::ios::end); 
    std::streamoff end_offset = file.tellp(); 
    std::cout << "Offset at end: " << end_offset << std::endl; 

    file << "Hello World" << std::endl; 

    std::streamoff final_offset = file.tellp(); 
    std::cout << "Offset after writing: " << final_offset << std::endl; 

    return 0; 
} 

Tôi mong đợi mọi sự thực thi sẽ nối thêm "Hello World" vào tệp. Tuy nhiên, tệp được cắt ngắn ngay khi nó được mở.

Tôi đang làm gì sai? Nếu đây là lỗi trong Visual Studio, có cách giải quyết nào không?

Edit: Mỗi khi chương trình chạy, bất kể các tập tin tồn tại hoặc đã có nội dung, kết quả đầu ra chương trình này:

Offset after opening: 0 
Offset at end: 0 
Offset after writing: 12 

Trả lời

6

Bạn cần phải mở tập tin trong cả sản lượng chế độ đầu vào :

std::fstream file("output.bin", std::ios::in | std::ios::out | std::ios::binary | std::ios::ate); 
+0

Cảm ơn, điều đó thực sự hiệu quả! Đây có phải là một lỗi trong phòng thu trực quan, hoặc là hành vi này dự định từ tiêu chuẩn? Tôi chưa tìm thấy bất kỳ tài liệu nào về việc này ... – zennehoy

+0

@zennehoy Mở tệp ở chế độ 'out' tương đương với 'fopen (tên tệp," w ")' và 'fopen' gọi với chế độ' "w" 'được chỉ định để cắt bớt tệp. Xem ví dụ [liên kết này] (http://en.cppreference.com/w/cpp/io/basic_filebuf/open) để xem danh sách các chế độ C++ và các chế độ 'fopen' tương ứng của chúng. –

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