Hỏi về đọc file

trong file INPUT.txt có:

nguyenvana
nguyenvanb
nguyenvanc

lệnh đọc file là

#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;

int main()
{ifstream filein("INPUT.txt");
string str;
int n=1;
while(filein.eof()==false)
{cout << "Day la dong thu: "<< n<< endl;
getline(filein, str);
cout << "Ho ten: "<<str<< endl;
n++;
}
/*n=1;                        // gọi lần nữa
filein.seekg(0,ios::beg);
while(filein.eof()==false)
{getline(filein, str);
cout << "Day la dong thu: "<< n<< endl;
cout << "Ho ten: "<<str<< endl;
n++;
Sleep(1000);
}*/
filein.close();
system("pause");
return 0;}

OUTPUT:

Day la dong thu: 1
Ho ten: nguyenvana
Day la dong thu: 2
Ho ten: nguyenvanb
Day la dong thu: 3
Ho ten: nguyenvanc
Day la dong thu: 4
Ho ten:

mọi người cho tôi hỏi ở đoạn code trên tại sao lại xuất hiện dòng thứ 4 với họ tên bị bỏ trống vậy, nếu đúng thì ở dòng thứ 3 lệnh eof() sẽ cho giá trị true và kết thúc vòng lặp rồi chứ, còn nữa, nếu tôi bỏ dấu comment ở chổ ‘gọi lần nữa’ và cho các lệnh trong đó chạy, vòng lặp ở chỗ ‘gọi lần nữa’ sẽ chạy vô hạn với OUTPUT là:

Day la dong thu: 1
Ho ten: 
Day la dong thu: 2
Ho ten: 
Day la dong thu: 3           
Ho ten: 
......

tôi đã cho con trỏ vị trí trong file quay lại đầu file để đọc bằng hàm seek(0, ios::beg), nếu đúng như thế thì vòng lặp này sẽ chạy giống giống như vòng lặp ở trên nhưng nó lại chạy đến vô hạn, mà có một cái nữa, cứ cho là nó chạy đến vô hạn đi thì tại sao ở dòng 1,2,3 nó không in ra nguyenvana, nguyenvanb, nguyenvanc mà lại bỏ trống, không lẽ lệnh seek(0, ios::beg) không hoạt động, tui mới học về đọc file chưa được bao lâu nên còn nhiều cái chưa biết, mọi người có thể giải thích cho tôi chứ

Bạn có dùng chữ nếu đấy.
Chính xác thì sau khi đọc xong dòng thứ 3 thì eof vẫn trả về false vì chưa hết tập tin. Còn trỏ đọc vẫn đang trỏ vào byte cuối cùng của tập tin. Chỉ khi đọc thêm 1 byte nữa thì eof mới trả về true, vì lúc này con trỏ đọc đã trỏ “ra ngoài” tập tin.

4 Likes

Vì vậy nên dùng điều kiện lặp là getline(stream, str) luôn vì nếu ko đọc được sẽ trả về 1 stream lỗi và dừng vòng lặp. Lúc này dùng eof hay fail để xem là đã đọc thành công không.

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