30/09/2018, 19:00

Đọc dữ liệu từ file

Cho mình hỏi làm cách nào để đọc dữ liệu từ file gồm nhiều dòng, mỗi dòng gồm các dữ liệu cách nhau bằng dấu gì đó (dấu ; chàng hạn). đọc từng dòng và lưu dữ liệu vào biến (nhiều loại biến khác nhau như string, int…)
Ví dụ mình có file với nội dung:
inp.txt
19; Tran Van A; 5.77
19; Nguyen Van B; 8.5

Giờ mình có 1 struct

struct HocSinh{
int tuoi;
string ten;
float diem;
};

Giờ có 2 học sinh, và yêu cầu nhập dữ liệu cho 2 học sinh từ file trên thì làm cách nào, mình cũng google nhiều mà vẫn không có hướng giải quyết.

Hứa Anh Minh viết 21:08 ngày 30/09/2018

using namespace std;

int main()
{
ifstream fi(“inp.txt”);
string delimiter = "; ";
while (!fi.eof())
{
string s;
getline(fi, s);
size_t pos = 0;
string token;
while ((pos = s.find(delimiter)) != string::npos) {
token = s.substr(0, pos);
cout << token << endl;
s.erase(0, pos + delimiter.length());
}
cout << s << endl;
}
fi.close();
}

Đầu tiên bạn sử dụng hàm getline để lấy toàn bộ chuỗi trên dòng đang xét. Sau đó split (chia) chuỗi vừa lấy vào thành nhiều chuỗi con mà không lấy phần ngăn cách là "; " (phần ngăn cách được gán trong biến kiểu chuỗi tên là delimitor). Biến chuỗi tên token dùng để lưu giá trị từng chuỗi con sau khi đã được chia; nếu bạn muốn chuyển nó thành kiểu số nguyên thì thêm int(token) vào biến nào đó tuỳ bạn. Sau đó cho một vòng lặp chạy từ đầu đến cuối chuỗi, gặp phần ngăn cách thì gán giá trị từ đầu chuỗi đến đó (không bao gồm phần ngăn cách) vào biến token rồi xoá phần đó (bao gồm phần ngăn cách) trong chuỗi chính. Cái hàm eof() có công dụng giúp nhận biết đã đọc đến cuối file rồi chưa, có kiểu bool, trả về true khi đã đến cuối file và false là ngược lại.

huong viết 21:12 ngày 30/09/2018

Cảm ơn bạn đã trả lời. Nhưng cách 1 dòng dữ liệu của mình gồm nhiều kiểu dữ liệu khác nhau như string, int, float…Nếu dùng các hàm convert từ string ra các kiểu dữ liệu khác thì không đúng lắm.
Mình định dùng các hàm làm việc với file trong C (dùng con trỏ file) nhưng gặp đến phần lấy 1 chuỗi từ file bằng fscanf lại bế tắc.
Ví dụ mình dùng:

fscanf(file, "%d; %s; %f");

Thì bien kiểu int và float lấy được, biến kiểu string lại không lấy được. Có cách nào khắc phục không nhỉ

viết 21:07 ngày 30/09/2018

đừng xài eof(): https://latedev.wordpress.com/2012/12/04/all-about-eof/

while (!fi.eof())
{
    string s;
    getline(fi, s);

sửa lại là

string s;
while (getline(fi, s))
{
Hứa Anh Minh viết 21:11 ngày 30/09/2018

Cảm ơn bạn đã góp ý cho code của mình

Bài liên quan
0