檔案操作

2020-10-10 14:00:45

檔案操作:

#include <iostream>
#include <fstream>
#include <windows.h>         // 為了使用Sleep()函數 
using namespace std;

struct FishOil//1定義一個結構
{
	std::string name;
	std::string uid;
	char sex;
};

bool InitFishC();//宣告一個初始化的函數
bool ReadFishC();//從檔案讀取資料
void RecordFishC();//記錄資料
bool WriteFishC(FishOil *OilData);//將資料寫入檔案

int main()
{
	int i;

	InitFishC();  // 2初始化資料。 
	while (1)
	{
		std::cout << "請選擇需要進行的操作: \n";
		std::cout << "1. 列印資料到螢幕\n";
		std::cout << "2. 錄入資料\n";
		std::cout << "3. 退出程式\n";
		std::cin >> i;//輸入你選擇的序號123

		switch (i)//根據i進行跳轉
		{
		case 1://從檔案中讀取資料並列印到螢幕上
			if (ReadFishC())//讀取檔案成功會有一個返回值,如果返回1表明讀取成功
				std::cout << "成功讀取檔案^_^\n\n";
			else
				std::cout << "讀取檔案失敗T_T\n\n";
			break;
		case 2:
			RecordFishC();//記錄資料
			break;
		case 3://退出程式
			return 0;
		}
	}

	std::cout << "初始化失敗T_T......\n\n";//沒有進入執行上述while迴圈

	return 0;

}

bool InitFishC()//初始化函數,使用bool型別是為了確定函數呼叫是否成功
{
	FishOil OilInit = { "白天", "fc00001", 'M' };//初始化結構,就是賦值

	if (WriteFishC(&OilInit) == false)//初始化之後寫進檔案,if判斷一下寫入函數是否呼叫成功,實參傳進去的是WriteFishC(&OilInit)是一個地址,結構的首地址
		std::cout << "初始化失敗T_T\n";
}

bool ReadFishC()//從檔案中讀出來
{
	std::string temp;//定義一個字串
	std::ifstream fileInput("FishC.txt");//使用檔案流開啟檔案省略了.open()函數

	if (fileInput.is_open())//開啟成功
	{
		std::cout << "\n正在輸出記錄資料...... ";
		for (int i = 0; i <= 100; i++)      // 列印百分比 
		{
			std::cout.width(3);//輸出的字串寬度
			std::cout << i << "%";
			Sleep(50);//在c++下以ms為單位,Sleep()裡面的單位,是以毫秒為單位,所以如果想讓函數滯留1秒的話,應該是Sleep(1000);
			std::cout << "\b\b\b\b";
		}
		std::cout << "\n\n";


		std::cout << " 姓名 " << "  身份證  " << " 性別 " << "\n\n";

		while (std::getline(fileInput, temp))//傳進去的引數第一個是輸入流fileInput為什麼不行????,讀出來的一行資料存在temp中
		{
			std::cout << temp << "   ";
			std::cout << "\n";
		}
		std::cout << "\n\n";

		return true;
	}
	else
		return false;
}

void RecordFishC()
{
	char goon, Save;
	FishOil OilData;//給結構定義一個物件
	FishOil *pOilData;//指向結構的指標

	goon = 'Y';//字元
	while ('Y' == goon)
	{
		std::cout << "請輸入賬號: ";
		std::cin >> OilData.name;
		std::cout << "請輸入身份證:";
		std::cin >> OilData.uid;
		std::cout << "請輸入性別:";
		std::cin >> OilData.sex;

		std::cout << "錄入成功, 請問需要儲存嗎?(Y/N)";
		std::cin >> Save;//字元
		if ('Y' == Save)//是否儲存
		{
			pOilData = &OilData;//指標指向OilData這個物件
			if (WriteFishC(pOilData))//寫入檔案,需要傳進去一個地址
				std::cout << "成功寫入檔案^_^\n";
			else
				std::cout << "寫入檔案失敗T_T\n";
		}
		else
		{
			return;
		}

		std::cout << "/n請問需要再次錄入嗎?(Y/N)";
		std::cin >> goon;
	}
}

bool WriteFishC(FishOil *pOilData)//寫入函數引數是一個指向結構體的指標,因此實參應該傳入一個地址
{
	std::ofstream fileOutput("FishC.txt", std::ios::app);//使用檔案流操作物件fileOutput,
	//引數std::ios::app如果沒有檔案,生成空檔案;如果有檔案,在檔案尾追加。
	// std::ios::app用來說明在老資料追加新資料 
	if (fileOutput.is_open())//判斷要寫進的檔案是否開啟成功,開啟成功進入if語句將其寫入檔案
	{
		fileOutput << pOilData->name << " ";
		fileOutput << pOilData->uid << " ";
		fileOutput << pOilData->sex << "\n";

		fileOutput.close();//寫入成功關閉檔案
		std::cout << "資料成功儲存到FishC.txt\n\n";
	}
	else
		std::cout << "儲存失敗T_T\n";
}