1. đặt fin.ignore(100, '
') sau mỗi lần xài fin >> ...
lý do là vì operator>> của istream thì sau khi trích dữ liệu thành công, nếu còn dư '
' thì ko bỏ dấu '
' này, nên nếu muốn xài istream::getline sau operator>> thì phải thêm istream::ignore(100, '
'). Nếu trích ko thành công (ví dụ đọc vào số 1,2,3... nhưng dòng input trong file là a,b,c,...) thì istream flag sẽ chuyển thành fail, lúc này thì có 2 lựa chọn là báo lỗi -> ngừng chương trình, hoặc chạy tiếp và cho giá trị đó mặc định là 0... Vậy tổng quát thì phải viết là:
Mã:
fin >> x;if (fin.fail()) { return false; //cách 1, chuyển kiểu trả về của hàm đọc file thành bool/int. Trong main sẽ bắt lỗi này. x = 0; //cách 2. main sẽ ko bắt được lỗi, ko khuyến khích xài cách này.}fin.ignore(100, '
'); fin.getline(...);
nếu bảo đảm là fin >> ... sẽ trích đúng kiểu dữ liệu thì khỏi cần check fin.fail sau mỗi lần extract >> ở đây.
Mã:
fin >> x;fin.ignore(100, '
'); fin.getline(...);
2. bỏ hết mấy cái fin.clear() đi... fin.clear() ko phải là bỏ qua các ký tự còn dư mà chỉ clear flag state của fin về good thôi (3 flag khác là bad (corrupt file), fail (sai kiểu dữ liệu, đọc ko hết, v.v...), eof (end-of-file)). Thay vì chỉ viết 1 dòng fin.clear() thì phải viết là
Mã:
fin.getline(...);if (fin.fail()) { fin.clear(); fin.ignore(100, '
');}
vì khi istream::getline đọc dữ liệu thành công nó sẽ bỏ dấu '
', khỏi cần istream::ignore(100, '
'). Tuy nhiên nếu đọc dữ liệu ko thành công (istream::fail()==true) do dòng input quá dài thì '
' sẽ ko được bỏ, phải bỏ qua (ignore) '
' và tất cả các ký tự còn dư trên dòng.
[/b] Tại Lương Sơn TV bạn sở hữu thể xem truyền hình trực tiếp bóng đá hôm nay các giải đấu to trong và ngoài nước. Lương Sơn TV ko chỉ đem lại những trận chiến mãn nhãn sở hữu chất lượng hình ảnh...
Các giải đấu không thể bỏ lỡ tại...