Hỏi về ghi file

#include <iostearm>
#include <fstream>
using namespace std;
int main()
{
	ofstream file;                     
	file.open("filetest.txt", ios_base::out); 
        file << "thửnghiệm";  // câu lệnh 1
        //file << "loli là lẽ sống";
	file.close(); 

	return 0;
}

câu lệnh này không biết có lỗi hay thiếu gì không mà ghi file nó bí mất dữ liệu. nghĩa là giả sử trong file test.txt của tui có sẳn dòng “12345678910” thì khi ‘câu lệnh 1’ được thực hiện , nó xóa hết dòng “12345678910” và chỉ ghi “thửnghiệm” vào trong file nghĩa là sau khi câu lệnh 1 được thực hiện, trong filetest.txt của tui sẽ thành là “thử nghiệm” thay vì"12345678910thửnghiệm". nó xóa hết những gì hiện có trong file và ghi cái mới vào. ban đầu tui nghĩ là chữ nó ghi đè lên với nhau nhưng tui nhận ra không đúng vì ghi đè chữ là phải “thửnghiệm10” còn cái này nó chỉ có mỗi"thửnghiệm". tui mới học về ghi file nên chưa rõ lắm, có bác nào biết cách khắc phục tình trạng này không

1234578910 có độ dài là 11 kí tự. Còn thửnghiệm nó dài đến 13 kí tự, chả có chỗ nào cho chuỗi cũ “lòi” ra đâu bạn. Đó là xét đến độ lớn bị ghi đè, nếu chuỗi cũ dài hơn nữa thì nó vẫn hoàn toàn biến mất.
Mình chưa rõ lý do, vì chỉ trunc mới được mô tả là xóa nội dung cũ, còn out thì không hề nhắc đến.

2 Likes

::out là nó xóa nội dung file cũ luôn, muốn ghi đè phải xài ::app
https://en.cppreference.com/w/cpp/io/basic_filebuf/open

action if file already exists + mode out -> Destroy contents

6 Likes

cảm ơn bác!!!, tui đã ghi được file mà không bị mất dữ liệu rồi

Nó ghi đè không phải là cái file có sẵn 10 ký tự và ghi thêm 5 vào thì nó ghi 5 ký tự mới và giữ 5 ký tự cũ.
Mà nó sẽ xoá toàn bộ nội dung file và ghi lại từ đầu.
Cái kết cuối dùng thì chỉ có các ký tự ở cụm lần ghi cuối cùng.

2 Likes

Cái này là do chế độ mở file, bạn mở ở chế độ mở file có sẳn và ghi nối tiếp thì nó sẽ k ghi đè nên dữ liệu cũ.(Áp dụng vs mọi ngôn ngữ lập trình)

1 Like

trong file cần đọc hiện chứa các dữ liệu:

This is line 1
This is line 2
This is line 3
This is line 4
This is line 5

câu lệnh được dùng để đọc file này như sau:

while (!fileInput.eof())
{
	char temp[255];       //dòng lệnh 1 
	fileInput.getline(temp, 255);       //dòng lệnh 2
	std::string line = temp;
	std::cout << line << std::endl;
}

sẵn đây mọi người có thể giải thích cho tui ‘dònh lệnh 1’ và dòng lệnh 2’ nó có ý nghĩa gì được không, tui nghĩ mãi chẳng ra, khó hiểu nhất là tại sao lại là 255

1 Like

Lâu lắm rồi cũng chả code C++ nhưng bạn xem lại kiểu dữ liệu char xem sao và cả cái fileInput.getline() nữa !
Hình như bạn k xem qua tài liệu trc khi code thì phải .Nếu bạn chưa xem qua thì làm sao biết đc nó cần truyền cái gì vào hàm và cái hàm, phương thức đó xử lí ra sao mà code

1 Like

Dòng 2 là đọc 1 dòng từ file, tối đa 254 kí tự.

255 là giá trị có thể được quy định từ đầu (như tối đa 80 char -> char[81]). hoặc để giảm số lần đọc thì để 512.

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