C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
结构
结构定义
为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
type_name 是结构体类型的名称,member_type1 member_name1 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在结构定义的末尾,最后一个分号之前,您可以指定一个或多个结构变量,这是可选的。
当需要处理一些具有多种属性的数据时,结构往往是很好的选择。例如
struct ID
{
string name;
string uid;
string sex;
};
注意:C++对于一个结构所能包含的变量的个数是没有限制的,那些变量通常我们成为该结构的成员,他们可以是任意一种合法的数据类型。
结构作为函数参数
在定义了一个结构之后,就可以使用如下所示的语法来创建该类型的变量了:
ID id;
id.name = "小明";
id.uid = "123456789";
id,sex = "男";
如果我们在创建一个结构类型变量的时候就已经知道它各个成员相关的值,我们可以在声明新变量的同时进行赋值:
ID id = {"小明","12345678","男"};
指向结构的指针
创建一个指向该结构的指针:
ID* pIDData;
pIDData = &IDData;
注意:因为指针的类型必须与指向的地址的变量的类型一致
我们可以通过对指针进行解引用来访问相应的变量值
(* pIDData).name = "小明";
(* pIDData).uid = "123456789";
(* pIDData).sex = "男";
或者可以用第二种方法:
pIDData->name = "小明";
pIDData->uid << "123456789";
pIDData->sex << "男";
下面以一个建立档案的具体例子进行说明:
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h> // 为了使用Sleep()函数
using namespace std;
struct ID
{
string name;
string uid;
string sex;
};
bool InitID();
bool ReadID();
void RecordID();
bool WriteID(ID* IDData);
int main()
{
int i;
InitID(); // 初始化数据。
while (1)
{
cout << "请选择需要进行的操作: \n";
cout << "1. 打印数据到屏幕\n";
cout << "2. 录入数据\n";
cout << "3. 退出程序\n";
cin >> i;
switch (i)
{
case 1:
if (ReadID())
cout << "成功读取文件^_^\n\n";
else
cout << "读取文件失败T_T\n\n";
break;
case 2:
RecordID();
break;
case 3:
return 0;
}
}
cout << "初始化失败T_T......\n\n";
return 0;
}
bool InitID()
{
ID IDInit = { };
if (WriteID(&IDInit) == false)
cout << "初始化失败T_T\n";
else
return true;
}
bool ReadID()
{
string temp;
ifstream fileInput("ID.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 << "\n\n";
cout << " 姓名 " << " 身份证 " << " 性别 " << "\n\n";
while (getline(fileInput, temp))
{
std::cout << temp << " ";
std::cout << "\n";
}
std::cout << "\n\n";
return true;
}
else
return false;
}
void RecordID()
{
char goon, Save;
ID IDData;
ID* pIDData;
goon = 'Y';
while ('Y' == goon)
{
cout << "请输入姓名: ";
cin >> IDData.name;
cout << "请输入身份证:";
cin >> IDData.uid;
cout << "请输入性别:";
cin >> IDData.sex;
cout << "录入成功, 请问需要保存吗?(Y/N)";
cin >> Save;
if ('Y' == Save)
{
pIDData = &IDData;
if (WriteID(pIDData))
cout << "成功写入文件^_^\n";
else
cout << "写入文件失败T_T\n";
}
else
{
return;
}
cout << "/n请问需要再次录入吗?(Y/N)";
cin >> goon;
}
}
bool WriteID(ID* pIDData)
{
ofstream fileOutput("ID.txt", ios::app);
// ios::app用来说明在老数据追加新数据
if (fileOutput.is_open())
{
fileOutput << pIDData->name << " ";
fileOutput << pIDData->uid << " ";
fileOutput << pIDData->sex << " \n";
fileOutput.close();
cout << "数据成功保存到ID.txt\n\n";
}
else
cout << "保存失败T_T\n";
return true;
}