Cách ghi file mà không xóa dữ liệu cũ trong C++

Em đang có 1 file .txt lưu dữ liệu ví dụ

Name: nghia Age: 22 ■■■: female
Name: dat Age: 23 ■■■: male
Name: dung Age: 22 ■■■: female

Bây giờ em muốn cập nhật dòng thứ 2 sang "Name: tien Age: 21 ■■■: female" thì e cần làm như nào ạ???
Em muốn chỉnh chỗ đó mà không làm xóa mất đi dữ liệu cũ ạ. Em có thử dùng ios_base::app nhưng nó chỉ định ghi vào cuối file dù em có dùng seekp để đưa con trỏ về vị trí dòng 2 e muốn update ạ!!

ko có cách nào, phải đọc hết vô mảng rồi cập nhật thông tin trong mảng đó rồi viết mảng đó xuống file lại. Còn nếu thay đổi được cấu trúc của file thì đổi lại ví dụ 1 “dòng” chỉ có ví dụ 25 bytes, trong đó 20 byte dành cho name, 4 byte dành cho age, 1 byte dành cho gender thì mới cập nhật dòng thứ i bằng cách seekp tới 25*i được. Còn hiện tại mỗi dòng có độ dài khác nhau thì lỡ dòng mới dài hơn dòng cũ thì phải chép lại toàn bộ dòng phía sau dòng đó.

4 Likes

a có thể viết giúp e đoạn code nếu mỗi dòng là 25 bytes thì cập nhật dòng thứ i được không ạ ???

// stream khi mở phải có flag std::ios::binary
stream.seekp(i * sizeof(Person));
stream.write(reinterpret_cast<const char*>(&person), sizeof(Person));
// ví dụ cho struct
struct Person {
    char name[20];
    int age;
    bool gender;
}; // struct này có size là 28, và phải viết code sao cho bảo đảm `name` chỉ chứa được tối đa 19 ký tự

// Mở file để vừa đọc và viết ở chế độ binary
std::fstream stream{dataFilePathStr, std::ios::in | std::ios::out | std::ios::binary};

// Đếm số người trong file
stream.seekg(0, std::ios::end);
const auto numPeople = stream.tellg() / sizeof(Person);
std::cout << "Number of people on file: " << numPeople << "\n";

// Viết `person` vào vị trí thứ `i` trong `stream`
Person person{"tien", 21, true};
size_t i = 1;
stream.seekg(i * sizeof(Person), std::ios::beg);
stream.write(reinterpret_cast<const char*>(&person), sizeof(Person));
3 Likes

e cảm ơn a rất nhiều ạ !!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?