Gặp vấn đề với việc đọc file text

while(!ifs.eof()){
    ifs >> c;
    cout << c;
}

Mọi người cho em hỏi tại sao em dùng dãy lệnh trên để đọc và xuất ra dữ liệu trong 1 file text thông qua việc đọc từng ký tự thì nó lại xuất ra dư 1 chữ ‘c’ so với dữ liệu trong file vậy ạ. Tại sao khi đọc tới chữ ‘c’ cuối ifs nó chưa tới eof mà phải đọc thêm 1 lần nữa vòng lặp mới dừng vậy ạ. Em cảm ơn.

em đừng xài .eof() :V đọc theo kiểu này:

while (ifs >> c) {
    cout << c;
}
  • ifs >> c trả về ifs để có thể đọc tiếp như ví dụ ifs >> a >> b(ifs >> a) >> b
  • Bất kì stream nào cũng có thể ép kiểu ngầm định về bool, true nghĩa là stream còn đọc được, false nghĩa là stream hết đọc được, có thể do đọc lỗi trước đó hoặc ko còn gì để đọc nữa.
  • Vậy viết while (ifs >> c) nghĩa là “khi đọc vào thành công 1 ký tự c từ ifs”

còn em xài .eof() thì dòng while đó có nghĩa là “khi ifs còn đọc được”, thì sau khi đọc ký tự 'c' cuối cùng, ifs vẫn còn được được :V Chỉ khi nó đọc tiếp ifs >> c là đọc vào ko thành công thì nó mới gán eof cho ifs. Nhưng em ko ktra .eof() giữa ifs >> ccout << c nên nó in ra c cũ :V

while(!ifs.eof()){ // có dòng ktra kia thì dòng này thừa
  ifs >> c;
  if (!ifs.eof()) // phải có dòng này ktra
    cout << c;
}

thành ra viết lại while (ifs >> c) là gọn nhất :V

7 Likes

em hiểu rồi, tks anh vì đã giúp đỡ.

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