Mọi người giúp e về tập tin trong C++

có 1 file txt được nhập = tay sẵn định dạng như sau
3
Ngô Đình
Diệm
BKEntertainment
Giám đốc
02/09/1995
Ninh Bình
Số 69, Trần Đại Nghĩa
[email protected]
0986666789
03/03/2016
03/03/2016,8h30,17h30
04/03/2016,8h30,17h30
05/03/2016,8h30,17h30
4
Trần Đức
Công
BKFood
Giám đốc
01/06/1995
Nam Định
Số 99, Lê Thanh Nghị
[email protected]
0123456789
03/03/2016
03/03/2016,8h30,17h30
04/03/2016,8h30,17h30
05/03/2016,8h30,17h30

dữ liệu nhân viên được xây dựng theo kiểu danh sách liên kết đơn
từng node có các thuộc tính sau: MaSo, Ho, Ten, Don Vi, ChucVu,NgaySinh, QueQuan, DiaChi, Email, SoDienThoai, NgayBatDauLamViec, ThongTinNgayLamViec
xây dựng hàm nhập toàn bộ dữ liệu từ file vào danh sách theo từng node trong danh sách

Tham khảo bài viết sau nhé bạn.


Sau khi tham khỏa xong thì hãy ngồi lại code nó rồi up code nếu có vấn đề chưa giải quyết được :smiley:

e muốn ghi vào danh sách liên kết đơn theo đúng định dạng như cái file .txt ý ạ, tức là dòng 1 thì vào MaSo của Node, dòng 2 vào Ho của Node, dòng 3 vào tên của Node, …xong Node này rồi thì sẽ chuyển sang Node khác để tạo ra danh sách liên kết ạ!

mình nhớ không nhầm trong c có hàm readLine là đọc từng dòng đó

e cũng tìm hiểu hàm getline đọc từng dòng rồi nhưng sau khi đọc xong e vẫn chưa nhập nó vào danh sách đc ạ!

bạn có thể post code lên được không? xem cho dễ

//
//  main.cpp
//  Tutorial_19_TapTin
//
//  Created by Huy Nguyen Dinh  on 5/14/16.
//  Copyright © 2016 Huy Nguyen Dinh. All rights reserved.
//

#include <iostream>
#include <string>
#include <fstream>

#include "ThongTinNhanVien.hpp"
#include "ThongTinBKCorporation.hpp"

using namespace std;

// Bước 1: Khai báo cấu trúc dữ liệu
struct NhanVien
{
    string MaSo, Ho, Ten, DonVi, ChucVu, NgaySinh, QueQuan, DiaChi, Email, SoDienThoai, NgayBatDauLV, ThongTinNgayLV;
};
typedef struct NhanVien NHANVIEN;

struct Node
{
    NHANVIEN Data; // data đang chứa KHACHHANG
    struct Node * pNext; // Con trỏ pNext tạo mối liên kết giữa các Node
};
typedef struct Node NODE;

struct List
{
    NODE * pHead;
    NODE * pTail;
};
typedef struct List LIST;


// Bước 2: Khởi tạo danh sách
void Init(LIST &l) {
    l.pHead = l.pTail = NULL;
}

// Bước 3: Tạo Node trong danh sách (lấy Data đóng vào trong Node)
NODE * GetNode(NHANVIEN data) {
    NODE * p = new NODE;
    
    // Nếu hết bộ nhớ trong máy tính ==> không tạo ra được Node
    if (p == NULL) {
        return NULL;
    }
    p->Data = data;
    p->pNext = NULL;
    return p;
}

// Bước 4: Thêm Node p vào đầu danh sách
void addHead(LIST &l, NODE * p) {
    // Nếu danh sách rỗng
    if (l.pHead == NULL) {
        l.pHead = l.pTail = p;
    }
    else
    {
        p->pNext = l.pHead; // Tạo mối liên kết mới
        l.pHead = p; // Cập nhật lại l.pHead;
    }
}

void addTail(List &l, NODE * p) {
    // Nếu danh sách rỗng
    if (l.pHead == NULL) {
        l.pHead = l.pTail = p;
    }
    else
    {
        l.pTail->pNext = p;
        l.pTail = p;
    }
}

// Hàm nhập khách hàng (sử dụng trong bước 5)
void nhapNhanVien(NHANVIEN &nv) {
    
    fflush(stdin); // xoá bộ nhớ đệm
    cout << "Nhập vào mã số: " << endl;
    getline(cin, nv.MaSo);
    
    fflush(stdin);
    cout << "Nhập vào họ: " << endl;
    getline(cin, nv.Ho);
    
    fflush(stdin);
    cout << "Nhập vào tên: " << endl;
    getline(cin, nv.Ten);
    
    fflush(stdin);
    cout << "Nhập vào đơn vị: " << endl;
    getline(cin, nv.DonVi);

    fflush(stdin);
    cout << "Nhập vào chức vụ: " << endl;
    getline(cin, nv.ChucVu);
    
    fflush(stdin);
    cout << "Nhập vào ngày sinh: " << endl;
    getline(cin, nv.NgaySinh);

    fflush(stdin);
    cout << "Nhập vào quê quán: " << endl;
    getline(cin, nv.QueQuan);
    
    fflush(stdin);
    cout << "Nhập vào địa chỉ: " << endl;
    getline(cin, nv.DiaChi);
    
    fflush(stdin);
    cout << "Nhập vào Email: " << endl;
    getline(cin, nv.Email);
    
    fflush(stdin);
    cout << "Nhập vào số điện thoại: " << endl;
    getline(cin, nv.SoDienThoai);
    
    fflush(stdin);
    cout << "Nhập vào ngày bắt đầu làm việc: " << endl;
    getline(cin, nv.NgayBatDauLV);
    
    fflush(stdin);
    cout << "Nhập vào thông tin ngày làm việc: " << endl;
    getline(cin, nv.ThongTinNgayLV);

}

// Hàm xuất khách hàng (sử dụng trong bước 5)
void xuatNhanVien(NHANVIEN &nv) {
    cout << "\nMã số: " << nv.MaSo;
    cout << "\nHọ: " << nv.Ho;
    cout << "\nTên: " << nv.Ten;
    cout << "\nĐơn vị: " << nv.DonVi;
    cout << "\nChức vụ: " << nv.ChucVu;
    cout << "\nNgày Sinh: " << nv.NgaySinh;
    cout << "\nQuê Quán: " << nv.QueQuan;
    cout << "\nĐịa Chỉ: " << nv.DiaChi;
    cout << "\nEmail: " << nv.Email;
    cout << "\nSố điện thoại: " << nv.SoDienThoai;
    cout << "\nNgày đầu làm việc: " << nv.NgayBatDauLV;
    cout << "\nThông tin ngày làm việc: " << nv.ThongTinNgayLV;
}

// Bước 5: Viết hàm InPut
void inPut(List &l) {
    Init(l);
    int n;
    cout << "Bạn muốn nhập bao nhiêu? " << endl;
    cin >> n;
    
    for (int i = 1; i <= n; i++) {
        NHANVIEN data;
        nhapNhanVien(data);
        
        Node * p = GetNode(data); // Đóng data vào trong 1 Node
        addTail(l, p); // Thêm vào cuối
    }
}

void outPut(LIST &l) {
    int dem = 0;
    for (NODE * p = l.pHead; p != NULL; p = p->pNext) {
        cout << "\n----------Thông tin nhân viên thứ: " << ++dem << "----------";
        xuatNhanVien(p->Data);
    }
}

void giaiPhong(LIST &l) {
    NODE * p; // Node phụ sẽ tham gia
    while (l.pHead != NULL) {
        p = l.pHead; // Cho p trỏ tới pHead
        l.pHead = l.pHead->pNext;
        delete p;
    }
}

đây là phần tạo khung danh sách của e

//
//  ThongTinBKCorporation.cpp
//  Tutorial_19_TapTin
//
//  Created by Huy Nguyen Dinh  on 5/15/16.
//  Copyright © 2016 Huy Nguyen Dinh. All rights reserved.
//

#include "ThongTinBKCorporation.hpp"
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

void ThongTinBKCoporation() {

    fstream f;
    
    string path = "/Users/huynd/Desktop/CodeC++/Tutorial_19_TapTin/";
    f.open(path+"input.txt", ios::in);
    
    string s;
    for(istreambuf_iterator<char,char_traits<char> > it(f.rdbuf());
        it != istreambuf_iterator<char,char_traits<char> >(); it++)   {
        
        s += *it;
    }
    
    f.close();
    cout << s.data() << endl;
}
1 Like

còn đây là bên đọc file .txt ạ!

1 Like

theo mình nghĩ bạn dùng hàm getline(f,string s) để đọc file từng dòng 1
khi đọc dòng đầu tiên bạn cho vào nv->maso luôn. còn bạn đọc file như kia là đọc hết cả file và cho vào 1 string

1 Like

ok a, cho e hỏi thêm là khi đọc hết thằng nhân viên đầu tiên rồi thì làm sao để biết để chuyển sang Node mới cho thằng nhân viên tiếp theo a nhỉ?

nếu mình biết trước số dòng của mỗi nhân viên có thể giới hạn trong vòng lặp luôn

dạ vâng ạ, có biết trước a ạ, em cám ơn anh nhé, em thử xem ạ!

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