Lỗi ghi đè lên file (Sau khi đã tinh toán, ghi lại để cập nhật thay đổi)

Chào mọi người, chúc mọi người một ngày vui vẻ!
Vào chủ đề chính lun: mình đang viết chương trình mô tả lại hoạt động của máy ATM bằng Linked List.
Mình sai ở tính năng chuyển tiền.
Quy trình hoạt động: …Nhập số tiền chuyển --> Xét điều kiện --> Cập nhật (Nếu thành công: thì cập nhật lại file, Nếu fail giữ nguyên hiện trường)
Lỗi gặp phải: (source bên dưới)
Error 1: (…Nhập tiền chuyển (Thỏa mãn điều kiện) --> Cập nhật lại file sau khi chuyển tiền)

  • file ban đầu:
    image
  • file sau khi chuyển tiền thành công: (chuyển từ tk: 01234567891011 --> 12345671234567: 100000VND)
    image
    —> Làm sao để nó không in ra dòng cuối cùng ấy ạ!
    Source Code:
/*
*	Thanh vien trong nhom:
*		1. Bui Van Hieu.
*		2. Nguyen Minh Triet.
*		3. Nguyen Dinh Trieu.
* 		4. Luong Thanh
* 		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 <time.h>	//thu vien thoi gian he thong
#pragma warning(disable : 4996) //_CRT_SECURE_NO_WARNINGS	//sua loi localtime

//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);

/*============================
*	Tinh Nang Chuyen Tien
==============================*/
void chuyenTien(List &L, Node *k, Node *t, string sUserInput);
void updateGiaoDich(List &L, string sUserInput, string sSoTKNguoiNhan, double dTienChuyen, double dTienConLai, double dTienDuocNhan);
int demSoLuongKH();
void ghiLichSu(List L, string sUserInput, double dTienChuyen, Node *k, Node *t, string sTypeGD);
//============================

/*============================
*	Tinh nawng rut tien
=============================*/

//============================

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

//============================

/*=========================
*	Tinh nang dang nhap
==========================*/
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;

	int i = 0;
	while (i < 3)
	{
		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 *t = 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, t, sUserInput);
						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:
*	- Cho nguoi dung nhap vao so taikhoan nguoi nhan
*	- Cho nhap so tien can chuyen: 
*		+ So tien chuyen lon hon 50000VND
*		+ So du trong tai khoan > 50000VND
*		+ Cap nhat so tien sau khi thuc hien giao dich
*		+ Ghi du lieu chuyen tien ra mot file khac
================================================================*/
void chuyenTien(List &L, Node *k, Node *t, string sUserInput)
{
	giaoDienATM("ChuyenTien");
	string sSoTKNguoiNhan = "";
	double dTienChuyen = 0.0;
	double dTienConLai = 0.0;
	double dTienDuocNhan = 0.0;
	double dTienKhaDung = 0.0;
	string s = "";
	do
	{
		system("cls");
		giaoDienATM("ChuyenTien");
		cout << "\t\t\t\t\tNhap so tai khoan nguoi nhan: ";
		rewind(stdin);
		getline(cin, sSoTKNguoiNhan);
	} while (sSoTKNguoiNhan == sUserInput);

	for (k = L.pHead; k != NULL; k = k->pNext)
	{
		dTienKhaDung = k->xDataKH.dSoDu - 50000;
		if (sSoTKNguoiNhan == k->xDataKH.sUser)
		{
			cout << "\n\t\t\t\t\tNhap so tien can chuyen: ";
			cin >> dTienChuyen;
			
			if (dTienChuyen > 50000 && dTienChuyen <= dTienKhaDung)
			{
				k->xDataKH.dSoDu += dTienChuyen;	//Tien cua nguoi nhan tang len sau giao dich
				dTienDuocNhan = k->xDataKH.dSoDu;
				cout << "Ban da chuyen tien thanh cong!" << endl;
				s = "thanhcong";
				Sleep(2000);
				break;
			}
			else
			{
				dTienDuocNhan = k->xDataKH.dSoDu;
				textColor(14); cout << "So tien khong kha dung, Chuyen tien that bai! ";
				s = "thatbai";
				Sleep(1000);
				break;
			}
		}
	}
	if (s == "thanhcong")
	{
		dTienConLai = t->xDataKH.dSoDu - dTienChuyen;
	}
	else if (s == "thatbai")
	{
		dTienConLai = t->xDataKH.dSoDu;
	}
	updateGiaoDich(L, sUserInput, sSoTKNguoiNhan, dTienChuyen, dTienConLai, dTienDuocNhan);
	ghiLichSu(L, sUserInput, dTienChuyen, k, t, "chuyentien");
}

//Sau khi giao dich ghi lai lich su giao dich va luu vao thu muc giao dich
void ghiLichSu(List L, string sUserInput, double dTienChuyen, Node *k, Node *t, string sTypeGD)
{
	time_t hientai = time(0);
	tm *ltm = localtime(&hientai);

	ofstream writeFile;
	writeFile.open("GiaoDich\\" + sUserInput + ".dat", ios::out);
	writeFile << "Loai giao dich" << "\t\t\t" << "|" << "\t\t\t" << "Nguoi chuyen: " << "\t\t\t" << "|" << "\t\t\t" << "Nguoi nhan: " << "\t\t\t" << "|" << "\t\t\t" << "Tien Chuyen" << "\t\t\t" << "|" << "\t\t\t" << "Ngay" << "\t\t\t" << "|" << "\t\t\t" << "Thang" << "\t\t\t" << "|" << "\t\t\t" << "Nam" << "\t\t\t" << "|" << "\t\t\t" << "Time" << endl;
	if (sTypeGD == "chuyentien")
	{
		writeFile << "Chuyen tien" << "\t\t\t" << "|" << "\t\t\t" << t->xDataKH.sTenKH << "\t\t\t" << "|" << "\t\t\t" << k->xDataKH.sTenKH << "\t\t\t" << "|" << "\t\t\t" << dTienChuyen << "\t\t\t" << "|" << "\t\t\t" << ltm->tm_mday << "\t\t\t" << "|" << "\t\t\t" << 1 + ltm->tm_mon << "\t\t\t" << "|" << "\t\t\t" << 1900 + ltm->tm_year << "\t\t\t" << "|" << "\t\t\t" << ltm->tm_hour << ':' << ltm->tm_min << ':' << ltm->tm_sec << endl;
	}
	writeFile.close();
}

//Cap nhat lai so tien trong tai khoang sau khi thuc hien giao dich chuyen tien
void updateGiaoDich(List &L, string sUserInput, string sSoTKNguoiNhan, double dTienChuyen, double dTienConLai, double dTienDuocNhan)
{
	Node *h;
	int nDem = 0;
	int nDemDong = demSoLuongKH();
	ofstream foutCus;
	foutCus.open("TheATM.dat");

	for (h = L.pHead; h != NULL; h = h->pNext)
	{
		nDem++;
		if (h->xDataKH.sUser == sUserInput)
		{
			foutCus << h->xDataKH.sUser << ", " << h->xDataKH.sPin << ", " << h->xDataKH.sTenKH << ", " << dTienConLai << ',' << h->xDataKH.sLoaiTienTe << endl;
		} 
		else if (h->xDataKH.sUser == sSoTKNguoiNhan)
		{
			foutCus << h->xDataKH.sUser << ", " << h->xDataKH.sPin << ", " << h->xDataKH.sTenKH << ", " << dTienDuocNhan << ',' << h->xDataKH.sLoaiTienTe << endl;
		}
		else
		{
			foutCus << h->xDataKH.sUser << ", " << h->xDataKH.sPin << ", " << h->xDataKH.sTenKH << ", " << h->xDataKH.dSoDu << ',' << h->xDataKH.sLoaiTienTe << endl;
		}
	}
	if (nDem < nDemDong)
	{
		foutCus << endl;
	}
	foutCus.close();
}

//Dem so luong khach hang co trong file
int demSoLuongKH()
{
	int nDem = 0;
	string s = "";
	ifstream finCus;
	finCus.open("TheATM.dat");
	while (!finCus.eof())
	{
		nDem++;
		getline(finCus, s, '\n');
	}
	finCus.close();
	return nDem;
}
//====================================================== Tinh Nang Chuyen Tien ========================= Bui Van Hieu ==========================================================================================

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

//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 << "\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 << "User:" << xKH.sUser << endl;
	cout << "Pin:" << xKH.sPin << endl;*/
	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, ',');
	finCus.ignore(1);
	getline(finCus, xKH.sPin, ',');
	finCus.ignore(1);
	getline(finCus, xKH.sTenKH, ',');
	finCus.ignore(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;
}

Xin được giúp đỡ, Nếu có đề xuất gì xin comment bên dưới.
Xin cám ơn!

Sửa thành:

foutCus.open("TheATM.dat", ofstream::out | ofstream::trunc);

Bạn phải ghi đè và loại bỏ nội dung cũ.

2 Likes

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

Bạn ơi khi mình chuyển tiền lần nhất thì dấu nháy “|” này xuống dòng, nhưng khi chuyển tiền tiếp theo thì lại bị như cũ

Dấu nháy nào? Trên Console hả?

3 Likes

Cái dấu này | mà khi gõ văn bản hay nhấp nháy đấy ạ

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