1
Xóa nội dung cũ của file trước khi ghi xuống nội dung mới trong C?
0
Ðức Bình30 đã đăng:

Chào các bạn, mình gặp vấn đề thế này, trong chương trình của mình có rất nhiều câu lệnh ghi nội dung xuống file nằm rải rác ở các hàm khác nhau.

FILE *f = fopen(fileName, "w"); // write - ghi đè
FILE *f = fopen(fileName, "a"); // append - thêm vào

Khi đó nếu mình chọn cách ghi file là ghi đè (w) thì nó chỉ ghi vào file ở dòng lệnh cuối cùng, ví dụ:

fprint(f, "Pi");
fprint(f, "Po");

Thì chỉ có mỗi Po được ghi xuống file, còn nội dung trước đó không còn nữa.

Nếu mình chọn cách ghi file là thêm vào (a) thì những lần chạy chương trình tiếp theo, nội dung cũ của file không được xóa trước khi thêm nội dung mới vào, mỗi lần chạy mình phải xóa file rất phiền phức.

Các bạn có giải pháp nào vừa khắc phục được chuyện không phải xóa file cũ trước khi ghi nội dung mới mà nội dung còn phải được ghi đầy đủ, không bị ghi đè nữa không? Rất cảm ơn sự giúp đỡ của các bạn.

thêm bình luận...
1
Member447810 đã đăng:

Bạn có thể sử dụng cả hai, đầu tiên sử dụng chế độ w để xóa nội dung cũ trong file (nếu có) và sau đó sử dụng chế độ a để thêm nội dung mới vào file ở các câu lệnh tiếp theo.

Có thể tạo một hàm có chức năng xóa nội dung (cũ) file như sau,

void clearFileContent(const char *filePath) {
    FILE *f = fopen(filePath, "w");
    if (f == NULL) {
        printf("Can not open file %s to erase data.\n", filePath);
        return;
    }
    fclose(f);
}

Gọi hàm này ở đầu chương trình, hàm sẽ xóa nội dung trước đó của file và để lại một file trống rỗng, lúc này bạn có thể thoải mái sử dụng câu lệnh ghi file với chế độ a,

FILE *f = fopen(fileName, "a");

Chương trình chính minh họa,

int main() {
    clearFileContent("file.txt");

    FILE *f = fopen("file.txt", "a");
    fprintf(f, "Pi");
    fprintf(f, "Po");

    return 0;
}
đã bổ sung 5.3 năm trước bởi
Avatar: Member4478 Member447810

Bạn có thể giải thích rõ hơn không?

Ðức Bình 22.01.2019

Bởi vì chế độ w sẽ xóa nội dung file trước khi nó ghi nội dung mới vào cho nên bạn có thể lợi dụng tính chất đó của nó để xóa nội dung cũ của file ở lần chạy chương trình trước, tức là mỗi lần chạy chương trình bạn sẽ không cần phải mở file lên và xóa bằng tay nữa.

Còn câu lệnh ghi xuống nội dung nằm rải rác ở các hàm khác nhau bạn nên sử dụng chế độ a sẽ tránh được trường hợp nội dung bị ghi đè bởi vì chế độ a chỉ thêm nội dung vào file mà không xóa nội dung trước đó của nó.

Vậy là bạn có thể giải quyết được 2 vấn đề rồi.

Member4478 22.01.2019

Cảm ơn bạn rất nhiều.

Ðức Bình 22.01.2019

Trong hàm clearFileContent, tại sao phải thêm điều kiện f == NULL khi chế độ ghi file w sẽ tự động tạo ra một file mới nếu chưa tồn tại file đó nhỉ? Hàm dưới đây cũng có thể chạy đúng.

void clearFileContent(const char *filePath) {
    FILE *f = fopen(filePath, "w");
    fclose(f);
}
V.I.P 23.01.2019
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)