您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
第11讲-复杂的数据类型05_对象的基础:结构
发布时间:2021-05-13 11:37:49编辑:雪饮阅读()
實現一個簡單的檔案錄入程序
要求可以錄入姓名,身份證號,性別。
以文本文件内容的形式作爲存儲庫。
這個題目的核心主要就是文件輸出流的兩種模式一種是追加模式一種是斷空模式(如果文件存在,把文件长度设为0)
其具體實現如:
#include <iostream>
#include <fstream>
#include <windows.h> // 为了使用Sleep()函数
using namespace std;
struct Person//1定义一个结构
{
std::string name;
std::string uid;
char sex;
};
/*
这里定义了bool布尔类型返回值,若函数体中没有任何return,则会导致该函数失去了bool的特性,
若将该函数的返回值用于if else中去判断,则永远都是只走"真”,不走else了
而且对于这种显式声明了返回值类型的函数,若不return,则会在某些编译器中无法编译通过,有网友测试了VS无法编译通过
*/
bool WritePerson(Person *pOilData, int type)//写入函数参数是一个指向结构体的指针,因此实参应该传入一个地址
{
std::ofstream fileOutput;
// ofstream是从内存到硬盘方向的流
if(type==1){
std::cout << "追加\n\n";
/*
這裏甲魚原來使用的是std::ofstream fileOutput("Person.txt", std::ios::app);一種固定方式,也沒有進行判斷是追加,而是他寫的初始化函數都是追加,所以都是統一的,這樣就免了寫open函數了
但是我個人覺得這樣不太好,因爲全部固定為追加模式,那麽下次運行本程序,則上次的沒有清空,所以本函數新增type,根據個人需求,來確定是否要追加或者是斷空
使用文件流操作对象fileOutput
参数std::ios::app如果没有文件,生成空文件;如果有文件,在文件尾追加。
std::ios::app用来说明在老数据追加新数据
*/
fileOutput.open("Person.txt",std::ios::app);
}
if(type==2){
std::cout << "斷空\n\n";
//fileOutput("Person.txt",std::ios::trunc);
fileOutput.open("Person.txt",std::ios::trunc);
}
if (fileOutput.is_open())//判断要写进的文件是否打开成功,打开成功进入if语句将其写入文件
{
fileOutput << pOilData->name << " ";
fileOutput << pOilData->uid << " ";
fileOutput << pOilData->sex << "\n";
fileOutput.close();//写入成功关闭文件
std::cout << "数据成功保存到Person.txt\n\n";
}
else
std::cout << "保存失败T_T\n";
}
bool InitPerson()//初始化函数,使用bool类型是为了确定函数调用是否成功
{
Person OilInit = { "白天不懂夜的黑", "xy220807", 'M' };//初始化结构,就是赋值
if (WritePerson(&OilInit,2) == false)//初始化之后写进文件,if判断一下写入函数是否调用成功,实参传进去的是WriteFishC(&OilInit)是一个地址,结构的首地址
std::cout << "初始化失败T_T\n";
}
bool ReadPerson()//从文件中读出来
{
std::string temp;//定义一个字符串
std::ifstream fileInput("Person.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 RecordPerson()
{
char goon, Save;
Person OilData;//给结构定义一个对象
Person *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 || 'y'==Save)//是否保存
{
pOilData = &OilData;//指针指向OilData这个对象
if (WritePerson(pOilData,1))//写入文件,需要传进去一个地址
std::cout << "成功写入文件^_^\n";
else
std::cout << "写入文件失败T_T\n";
}
else
{
return;
}
std::cout << "/n请问需要再次录入吗?(Y/N)";
std::cin >> goon;
}
}
int main()
{
int i;
InitPerson(); // 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 (ReadPerson())//读取文件成功会有一个返回值,如果返回1表明读取成功
std::cout << "成功读取文件^_^\n\n";
else
std::cout << "读取文件失败T_T\n\n";
break;
case 2:
RecordPerson();//记录数据
break;
case 3://退出程序
return 0;
}
}
std::cout << "初始化失败T_T......\n\n";//没有进入执行上述while循环
return 0;
}
編譯並運行結果如:
关键字词:文件輸出流,指針,斷空
下一篇:第12讲-传值、传址和传引用