檔案操作:
#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";
}