Chương trình mô phỏng máy ATM bị lỗi console khi run code

  • Chào mọi người!
    Tình hình là em đang làm một chương trình mô phỏng máy ATM, nhưng khi build và run code (Visual 2015 community) thì màn hình console đen thùi lùi không hiện những gì cả. Và khi compiler cũng không có lỗi gì luôn.
  • Hình ảnh bị lỗi:
  • Dưới đây là code của em:
/*
*	Thanh vien trong nhom:
*		1. Bui Van Hieu.
*		2. Nguyen Minh Triet.
*		3. Nguyen Dinh Trieu.
* 		4.
* 		5.
*	Project: Mo ta hoat dong cua may ATM.
*	Create of date: 04/05/2019.
*/

//Khai bao thu vien va tien xu ly
#include <iostream>
using namespace std;
#include <string>	//thu vien xu ly chuoi
#include <fstream>	//thu vien nhap xuat file
#include <conio.h>	//thu vien nhan gia tri tu phim
#include <windows.h>	//thu vien giao dien tren console
#include <ctime>	//thu vien thoi gian he thong

//tao doi tuong Khach Hang
struct KhachHang
{
	string sUser = "", sPin = "", sTenKH = "";
	double dSoDu = 0.0;
	string sLoaiTienTe = "";
};
//tao doi tuong Node chua du lieu khach hang
struct Node
{
	KhachHang xDataKH;
	Node *pNext;
};
//tao doi tuong List
struct List
{
	Node *pHead, *pTail;
	List()
	{
		pHead = pTail = NULL;
	}
};

//Khai bao nguyen mau ham
Node *createNote(KhachHang xKH);	//tao Node moi
string maHoa_Pass(int maxLength);		//chuyen ky tu nhap vao thanh dau *
void textColor(int iColor);
void giaoDienATM(string sGD); //giao dien ATM
void addTail(List &L, KhachHang xKH);
void docData_1_KhachHang(ifstream &finCus, KhachHang &xKH);
void xuatData_1_KhachHang(KhachHang xKH);
void inputList(List &L, ifstream &finCus);
void outputList(List L);
void ghiLaiGiaoDich(KhachHang xKH, ofstream foutCus, string loaiGiaoDich);
void tinhNangRutTien(List L, Node *t);

void chuyenTien(List &L, Node *k);
void updateGiaoDich(List &L);

void logIn(List &L);		//man hinh dang nhap

//Chuong trinh chinh
void main()
{
	List L;
	ifstream finCus; // b1. doc du lieu tu file len
	finCus.open("TheATM.dat"); //b2. mo file.

	inputList(L, finCus);	//b3. doc du lieu tu file len
	outputList(L);
	finCus.close();		//b4. dong file

	/*logIn(L);*/

	system("pause");
}

/*=======================
//*	Chuc nang dang nhap
//=======================*/
void logIn(List &L)
{
	string sUserInput;
	string sPinInput = "";
	int nDemLanSai = 0;
	int nLuaChon = 0;
	/*char c;*/

	int i = 0;
	while (i < 3)
	{
		////ham nhap phim ESC de thoat chuong trinh
		//while (true)
		//{
		//	if (_kbhit())		//kiem tra nguoi dung co nhan phim hay khong
		//	{
		//		c = _getch();
		//		if (c == 27)
		//		{
		//			break;
		//		}
		//	}
		//}
		giaoDienATM("Login");
		textColor(12); cout << "\t\t\t\t=====  Luu y: nhan ESC de thoat chuong trinh =====" << endl;

		textColor(10); cout << "\t\t\t\t\tUser: "; //nhap user
		rewind(stdin);
		getline(cin, sUserInput);

		//nhap pin
		textColor(10); cout << "\t\t\t\t\tPin:  ";
		sPinInput = maHoa_Pass(6);

		Node *k = L.pHead;
		Node *q = L.pHead;
		for (q = L.pHead; q != NULL; q = q->pNext)
		{
			if (sUserInput == q->xDataKH.sUser && sPinInput == q->xDataKH.sPin)		//ca 2 deu phai dung
			{
				cout << "\t\t\t\t\tDang dang nhap ..." << endl;
				Sleep(1000);
				system("cls");
				cout << "\t\t\t\t\t====== Dang nhap thanh cong ======" << endl;
				Sleep(1000);
				system("cls");
				giaoDienATM("Menu");
				cout << "Lua chon chuc nang: ";
				cin >> nLuaChon;
				do
				{
					switch (nLuaChon)
					{
					case 1:		//nhan 1 de chon tinh nang rut tien
						system("cls");
						giaoDienATM("RutTien");
						/*tinhNangRutTien(L, t);*/
						break;
					case 2:
						system("cls");
						textColor(11); /*chuyenTien(L, k);*/
						break;
					case 3:
						giaoDienATM("XemThongTin");
						break;
					default:
						Sleep(1000);
						cout << "Cam on quy khach da su dung dich vu!";
						cout << "\nGoodbye!\n";
						nLuaChon = 5;
						break;
					}
				} while (nLuaChon > 0 && nLuaChon <= 4);
			}
			else if (sUserInput == q->xDataKH.sUser || sPinInput == q->xDataKH.sPin)//1 trong 2 user hoac pass sai
			{
				nDemLanSai++;
				cout << "\t\t\t\t\t Dang dang nhap ..." << endl;
				Sleep(1000);
				system("cls");
				textColor(12); cout << "\t\t\t\t\t====== Sai user hoac pin ======" << endl;
				textColor(12); cout << "\t\t\t\t\tVui long dang nhap lai!" << endl;
				i++;
			}
		}
		if (nDemLanSai < 3) //sai nho hon 3 lan
		{
			textColor(12); cout << "\t\t\t\t\t\tQuy khach con " << 3 - nDemLanSai << " lan sai!\n";
		}
		if (nDemLanSai >= 3)	//sai qua 3 lan
		{
			textColor(12); cout << "\t\t\t\t\t\tQuy khach da dang nhap sai qua 3 lan!\n";
			i += 4;
			break;
			textColor(7);
		}
	}
}

/*=====================
* Rut tien
=======================*/
//void tinhNangRutTien(List L, Node *t)
//{
//	double dNhapTienRut = 0.0;
//	int nN;
//	char c;
//	string sMatKhauXacNhan = "";
//	giaoDienATM("RutTien");
//	cout << "Luu y so tien rut lon hon 50000!";
//	cout << "Nhap so tien rut:" ;
//	cin >> dNhapTienRut;
//	double dSoTienKhaDung = t->xDataKH.dSoDu - 50000;
//	if (dNhapTienRut > dSoTienKhaDung && dNhapTienRut < 50000)
//	{
//		cout << "So tien trong tai khoan khong du de thuc hien giao dich nay!" << endl;
//	}
//	else
//	{
//		system("cls");
//		giaoDienATM("RutTien");
//		cout << "So tien ban can rut la: " << dNhapTienRut << t->xDataKH.sLoaiTienTe;
//		cout << "\nBan co muon tiep tuc xac nhan mat khau hay khong (C/K)?\n";
//		cout << "Nhap 'C' de xac nhan rut tien hoac nhap 'K' huy rut tien!\n";
//		if (c == 'C' || c == 'c')
//		{
//			cout << "Nhap mat khau cua ban:";
//			sMatKhauXacNhan = maHoa_Pass(6);
//			if (sMatKhauXacNhan == t->xDataKH.sPin)
//			{
//				cout << "Ban da rut " << dNhapTienRut << t->xDataKH.sLoaiTienTe << " thanh cong!\n";
//				cout << "Giao dich thanh cong!\n";
//				double dSoTienConLai = t->xDataKH.dSoDu - dNhapTienRut;
//				cout << "So tien con lai trong tai khoan la:" << dSoTienConLai << t->xDataKH.sLoaiTienTe << endl;
//				//Ghi du lieu len file sau khi da rut tien
//				ghiLaiGiaoDich("GDRUTTIEN");
//			}
//			else if(sMatKhauXacNhan != t->xDataKH.sPin)
//			{
//				cout << "Giao dich bi huy!\n";
//			}
//		}
//		if (c == 'K' || c == 'k')
//		{
//			cout << "He thong ngung giao dich!";
//		}
//	}
//}

/*====================
*	Chuyen tien
=====================*/
void chuyenTien(List &L, Node *k)
{
	giaoDienATM("ChuyenTien");
	string sSoTKNguoiNhan = "";
	double dTienChuyen = 0.0;
	double dTienConLai = 0.0;
	string s = "";

	do
	{
		system("cls");
		giaoDienATM("ChuyenTien");
		cout << "\t\t\t\t\tNhap so tai khoan nguoi nhan: ";
		fflush(stdin);
		getline(cin, sSoTKNguoiNhan);
	} while (sSoTKNguoiNhan == k->xDataKH.sUser);

	double dTienKhaDung;
	for (k = L.pHead; k != NULL; k = k->pNext)
	{
		dTienKhaDung = k->xDataKH.dSoDu - 50000;
		if (sSoTKNguoiNhan == k->xDataKH.sUser)
		{
			cout << "Nhap so tien can chuyen: ";
			cin >> dTienChuyen;

			if (dTienChuyen >= 50000 && dTienChuyen <= dTienKhaDung)
			{
				cout << "Ban da chuyen tien thanh cong!" << endl;
				Sleep(2000);
			}
			else
			{
				cout << "Chuyen tien that bai! " << endl;
				cout << "Nhap ESC de tro ve menu: ";
				cin >> s;
				if (s == "esc" || s == "ESC")
				{
					cout << "Cam on da su dung dich vu!" << endl;
				}
				Sleep(1000);
			}
		}
		updateGiaoDich(L);
	}
}

//Cap nhat thong tin khach hang
void updateGiaoDich(List &L)
{
	Node *h;
	ofstream foutCus;
	foutCus.open("TheATM.dat");
	for (h = L.pHead; h != NULL; h = h->pNext)
	{
		foutCus << h->xDataKH.sUser << ", " << h->xDataKH.sPin << ", " << h->xDataKH.sTenKH << ", " << h->xDataKH.dSoDu << h->xDataKH.sLoaiTienTe << endl;
	}
	foutCus.close();
}



/*=============================
*	Xem thong tin khach hang
=============================*/

////ham ghi ra file khi htuc hien xong giao dich
//void ghiLaiGiaoDich(string loaiGiaoDich)
//{
//	double dNhapTienRut, double dTienChuyen;
//	time_t baygio = time(0);
//	/*cout << "So giay ke tu 1/1/1970 la: " << baygio << endl;*/
//	tm *ltm = localtime(&baygio);
//	ofstream foutCus;
//	Node *a;
//	if (loaiGiaoDich == "GDRUTTIEN")
//	{
//		foutCus.open(a->xDataKH.sID + ".txt");
//		
//	}
//	if (loaiGiaoDich == "GDCHUYENTIEN")
//	{
//		foutCus.open(a->xDataKH.sID + ".txt");
//		
//	}
//}

////ham lay thoi gian hien tai de ghi vao lich su giao dich
//string thoigianhethong()
//{
//	// tra ve date/time hien tai dua tren system hien tai
//	time_t baygio = time(0);
//	/*cout << "so giay ke tu 1/1/1970 la: " << baygio << endl;*/
//	tm *ltm = localtime(&baygio);
//
//	// in cac thanh phan cua cau truc tm struct.
//	cout << "ngay: " << ltm->tm_mday << "thang: " << 1 + ltm->tm_mon << "nam: " << 1900 + ltm->tm_year << endl;
//	cout << "thoi gian: " << 1 + ltm->tm_hour << ":" << 1 + ltm->tm_min << ":" << 1 + ltm->tm_sec << endl;
//}

//xuat du lieu tu file
void outputList(List L)
{
	Node *p = L.pHead;
	int nDem = 0;
	for (p = L.pHead; p != NULL; p = p->pNext)
	{
		cout << "\n\nKhach hang thu:" << nDem++ << endl;
		xuatData_1_KhachHang(p->xDataKH);
	}
}

//Du du lieu khach hang vao Node
void inputList(List &L, ifstream &finCus)
{
	KhachHang xKH;
	while (!finCus.eof())	// lenh !finCus.eof(): end of file, neu con tro tro den cuoi file la dung thi thuc hien
	{
		docData_1_KhachHang(finCus, xKH);
		addTail(L, xKH);
	}
}

//xuat du lieu khach hang
void xuatData_1_KhachHang(KhachHang xKH)
{
	cout << "Ten khach hang:" << xKH.sTenKH << endl;
	cout << "So du:" << xKH.dSoDu << xKH.sLoaiTienTe << endl;
}

//doc du lieu khach hang
void docData_1_KhachHang(ifstream &finCus, KhachHang &xKH)
{
	getline(finCus, xKH.sUser, ',');
	rewind(stdin);
	finCus.seekg(1, 1);	//bo qua 1 byte ky tu
	getline(finCus, xKH.sPin, ',');
	rewind(stdin);
	finCus.seekg(1, 1);
	getline(finCus, xKH.sTenKH, ',');
	rewind(stdin);
	finCus.seekg(1, 1);
	finCus >> xKH.dSoDu, ',';
	finCus.ignore(1);
	getline(finCus, xKH.sLoaiTienTe);
}

//thong tin khach hang vao cuoi danh sach
void addTail(List &L, KhachHang xKH)
{
	Node *pNew = createNote(xKH);
	if (L.pHead == NULL)
	{
		L.pHead = L.pTail = pNew;
	}
	else
	{
		L.pTail->pNext = pNew;
		L.pTail = pNew;
	}
}

//tao mot Node moi chua du lieu chua lien ket voi List
Node *createNote(KhachHang xKH)
{
	Node *p = new Node;
	if (p == NULL)
	{
		exit(1);
	}
	else
	{
		p->xDataKH = xKH;
		p->pNext = NULL;
	}
	return p;
}

//ham lay mau sac cho text
void textColor(int iColor)
{
	HANDLE hConsoleColor;
	hConsoleColor = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hConsoleColor, iColor);
}

//ham hien thi giao dien
void giaoDienATM(string sGD)
{
	if (sGD == "Login")
	{
		textColor(10); cout << "\t\t\t\t\t*********************************" << endl;
		textColor(10); cout << "\t\t\t\t\t*\t";
		textColor(14); cout << "Dang nhap he thong";
		textColor(10); cout << "\t*" << endl;
		textColor(10); cout << "\t\t\t\t\t*********************************" << endl;
	}
	else if (sGD == "Menu")
	{
		textColor(13);
		cout << "\t\t\t\t\t*********************************" << endl;
		cout << "\t\t\t\t\t*  Chon chuc nang de thuc hien  *" << endl;
		cout << "\t\t\t\t\t*********************************" << endl;
		cout << endl;
		cout << "	Chon 1. DE RUT TIEN.\n";
		cout << "	Chon 2. DE CHUYEN TIEN.\n";
		cout << "	Chon 3. DE XEM GIAO DICH.\n";
		cout << "	Chon 4. DE THOAT KHOI HE THONG.\n	";
	}
	else if (sGD == "RutTien")
	{
		cout << "\t\t\t\t\t*********************************" << endl;
		cout << "\t\t\t\t\t*            Rut Tien           *" << endl;
		cout << "\t\t\t\t\t*********************************" << endl;
		cout << endl;
	}
	else if (sGD == "ChuyenTien")
	{
		cout << "\t\t\t\t\t*********************************" << endl;
		cout << "\t\t\t\t\t*           Chuyen Tien         *" << endl;
		cout << "\t\t\t\t\t*********************************" << endl;
		cout << endl;
	}
	else if (sGD == "XemThongTin")
	{
		cout << "\t\t\t\t\t*****************************************" << endl;
		cout << "\t\t\t\t\t*           Thong Tin Giao Dich         *" << endl;
		cout << "\t\t\t\t\t*****************************************" << endl;
	}
}

//ma hoa pass thanh dau *
string maHoa_Pass(int maxLength)
{
	string pW = "";
	for (char c; (c = _getch());)  // lenh _getch() de nam bat su kien ban phim
	{
		if (c == '\n' || c == '\r') //\n: phim enter, \r xuong dong
		{
			std::cout << "\n";
			break;
		}
		else if (c == '\b')	 //phim backspace
		{
			std::cout << "\b \b";
			if (!pW.empty()) pW.erase(pW.size() - 1);
		}
		else if (c == -32) //phím mũi tên
		{
			_getch(); //bo qua ki tu tiep theo (huong mui ten)
		}
		else if (isprint(c) && pW.size() < maxLength)	//isprint nhan nhung ky tu in ra duoc (co khoang trang)
		{
			std::cout << '*';
			pW += c;
		}
	}
	return pW;
}

Do quá trình đọc tập tin đấy.

Nhầm Thế bạn biết ý nghĩa của hàm `rewind()` không mà dùng nó vô tội vạ thế kia? Ứng dụng của bạn đang **lặp vô hạn** đấy. http://www.cplusplus.com/reference/cstdio/rewind/

Do hàm seekg():
Bạn luôn đưa con trỏ về 1 vị trí. Cứ thế mà lặp vô hạn, không bao giờ chạy đến cuối tập tin được.

Bạn đang dùng vài hàm mà bạn chưa hiểu rõ một cách vô tội vạ. Nguy hiểm lắm đấy. Trước khi dùng thì cũng phải hiểu rõ nó làm gì. Cẩn thận lại “Cõng rắn cắn gà nhà”. :smiling_imp:

3 Likes

Cám ơn bạn đã giúp đỡ!
Do đồ án môn học gấp rút nên tui xem lệnh seekg để bỏ qua khoảng trắng trên mạng nên mới vậy!
Bạn có đề xuất nào nếu dữ liệu file vd như:
1234567, 00000, bui van hieu

…để bỏ khoảng trắng sau mỗi dấu ,

Nếu dữ liệu bạn lưu từng dòng thì nên dùng hàm getline(), sau đó tách ra để lấy dữ liệu, tránh bị lộn qua dòng khác.
Bạn nên dùng hàm strtok() để tách dữ liệu. Ví dụ thì Google chi tiết.

2 Likes

Cám ơn nhiều mình làm được rồi!

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