结构:
结构(Structure)是一种由程序员定义的,由其他变量类型组合而成的数据类型
定义一个结构的基本语法是:
struct name
{
type varName1;
type varName2;
};
注意后面会有一个分号。
当需要处理一些具有多种属性的数据时,结构往往是很好的选择
例如编写一个鱼油管理程序时,涉及到的基本特征有:姓名、身份证、性别等
struct FishOil
{
std::string name;
std::string uid;
char sex;
};
注意:C++对于一个结构所能包含的变量的个数是没有限制的,那些变量通常我们称为该结构的成员,他们可以是任意一种合法的数据类型。
FishOil Jiayu; // 创建一个FileOil结构类型Jiayu
Jia.name = "小甲鱼";
Jia.uid = "fishc_00000";
Jia.sex = 'M';
先定义结构
之后用“.”对结构成员进行赋值
如果我们在创建一个结构类型变量的时候就已经知道它的各个成员相关的值,我们可以在声明新变量的同时进行赋值。例如:
FishOil Jiayu = {"小甲鱼", "fishc_00000", 'M'}
结构与指针
创建一个指向该结构的指针:
FishOil *pJiayu = &Jiayu;
注意:因为指针的类型必须与指向的地址的变量的类型一致,所以pJiayu指针的类型也是FishOil
下面有两种方法来访问结构里面的变量值
第一种:可以通过指针进行解引用来访问相应的变量值
(*pJiayu).name = "随便";
(*pJiayu).uid = "fishc_00001";
第二种:
pJiayu -> name = "随便";
pJiayu -> uid = "fishc_00001";
pJiayu -> sex = F;
std::cout << pJiayu ->name;
std::cout << pJiayu ->uid;
std::cout << pJiayu ->sex;
什么时候用“.”,什么时候用“->”呢,就是说前面如果是指针解引用的话就是用“.”,前面如果是指针的话就用“->”。
练习:
- 定义一个结构,至少存储:姓名、身份证、性别
- 实现文件存储
- 可以打印到屏幕上
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h> //为了使用Sleep()函数
using namespace std;
struct FishOil
{
string name;
string ID;
char sex;
};
bool InitFishC();
bool ReadFishC();
void RecordFishC();
bool WriteFishC(FishOil *OilData);
int main()
{
int i;
InitFishC(); //初始化数据
while (1)
{
cout << "请选择需要进行的操作:" << endl;
cout << "1. 打印数据到屏幕" << endl;
cout << "2. 录入数据" << endl;
cout << "3. 退出程序" << endl;
cin >> i;
switch (i)
{
case 1:
if (ReadFishC())
{
cout << "成功读取文件" << endl;
}
else
{
cout << "读取文件失败" << endl;
}
break;
case 2:
RecordFishC();
break;
case 3:
return 0;
}
}
cout << "初始化失败" << endl;
return 0;
}
bool InitFishC()
{
FishOil OilInit = { "小甲鱼", "fishc00001", 'M' };
if (WriteFishC(&OilInit) == false)
{
cout << "初始化失败" << endl;
return true;
}
else
{
return false;
}
}
bool ReadFishC()
{
string temp;
ifstream fileInput("FishC.txt");
if (fileInput.is_open())
{
cout << "\n正在输出记录数据...";
for (int i = 0; i <= 100; i++) //打印百分比
{
cout.width(3);
cout << i << "%";
Sleep(50);
cout << "\b\b\b\b";
}
cout << endl;
cout << "姓名" << "身份证" << "性别" << endl;
while (getline(fileInput, temp))
{
cout << temp << " ";
cout << endl;
}
cout << endl;
return true;
}
else
{
return false;
}
}
void RecordFishC()
{
char goon, Save;
FishOil OilData;
FishOil *pOilData;
goon = 'Y';
while ('Y' == goon)
{
cout << "快输入鱼C账号";
cin >> OilData.name;
cout << "请输入鱼C身份证";
cin >> OilData.ID;
cout << "请输入性别";
cin >> OilData.sex;
cout << "录入成功,请问需要保存吗?(Y/N)";
cin >> Save;
if ('Y' == Save)
{
pOilData = &OilData;
if (WriteFishC(pOilData))
{
cout << "成功写入文件" << endl;
}
else
{
cout << "写入文件失败" << endl;
}
}
else
{
return;
}
cout << "/n请问需要再次录入吗?(Y/N)";
cin >> goon;
}
}
bool WriteFishC(FishOil *pOilData)
{
ofstream fileOutput("FishC.txt", ios::app); //用来说明在老数据追加新数据
if (fileOutput.is_open())
{
fileOutput << pOilData->name << " ";
fileOutput << pOilData->ID << " ";
fileOutput << pOilData->sex << endl;
fileOutput.close();
cout << "数据成功保存到FishC.txt" << endl;
return true;
}
else
{
cout << "数据保存失败" << endl;
return false;
}
}
上面的函数是抄的别人的,慢慢弄明白,自己要能写出来才行