Tôi có một tệp đã chứa một số dữ liệu (ví dụ: 8 kB). Tôi muốn đọc một cái gì đó từ đầu của tập tin, và sau đó ghi đè lên dữ liệu bắt đầu từ nơi tôi đọc xong. Vì vậy, tôi cố gắng sử dụng đoạn mã sau:Đọc và ghi vào cùng một tệp bằng cách sử dụng cùng một fstream
std::fstream stream("filename", std::ios::in | std::ios::out | std::ios::binary);
char byte;
stream.read(&byte, 1);
// stream.seekp(1);
int bytesCount = 4096;
auto bytesVec = std::vector<char>(bytesCount, 'c');
char* bytes = bytesVec.data();
std::cout << stream.bad() << std::endl;
stream.write(bytes, bytesCount);
std::cout << stream.bad() << std::endl;
Nếu tôi thực thi mã này, bad()
lợi nhuận đầu tiên false
, nhưng một trong những thứ hai trả true
và không có gì thực sự được viết ra.
Nếu tôi giảm bytesCount
xuống bất kỳ thứ gì nhỏ hơn 4096 (có lẽ là kích thước của một số bộ đệm bên trong), thì bad()
thứ hai trả về false
, nhưng vẫn không có gì được viết.
Nếu tôi bỏ ghi chú dòng seekp()
, văn bản bắt đầu hoạt động: bad()
trả lại false
và các byte thực sự được viết.
Tại sao cần seekp()
ở đây? Tại sao nó không hoạt động mà không có nó? seekp()
có đúng cách để thực hiện việc này không?
Tôi đang sử dụng Visual Studio 2012 trên Windows 7.
Tài liệu này có được ghi nhận cho luồng C++ không? Hoặc thực hiện MS không tuân thủ các tiêu chuẩn trong lĩnh vực này? – svick
@svick Xem cập nhật. –