结构
结构(Structure)是一种由程序员定义的、由其他变量类型组合而成的数据类型
定义
1 2 3 4 5 6
| struct name { type varName1; type varName2; 。。。。。。 }; //注意这个分号
|
应用
- 当需要处理一些具有多种属性的数据时,结构往往是很好的选择。
- 例如当我们在编写一个档案人员时,涉及到的基本特征有:姓名、身份证、性别。。。
1 2 3 4 5 6
| struct People { std::string name; std::string uid; char sex; // F==Female, M==Male };
|
注意点
C++对于一个结构所能包含的变量的个数是没有限制的,那些变量通常我们成为该结构的成员,他们可以是任意一种合法的数据类型
在定义了一个结构之后,就可以使用如下所示的语法来创建该类型的变量了
People people; // 创建一个People结构类型people
people.name = “张三”;
people.uid = “people_00000”;
people.sex = ‘M’;
用点操作符进行赋值
People people = { 张三, “people_00000”, ‘M’ }
结构与指针
在C、C++里,指针无所不能,也可以指向结构,就像指向其他任何变量那样。
问题
怎样才能通过指针解引用该指向结构的各个成员?(或者说是通过指针访问各个成员的值)
创建一个指针
因为指针的类型必须与指向的地址的变量的类型一致,所以pPeople指针的类型也是People
People *pPeople = &people;
解引用
通过对指针进行解引用来访问相应的变量值
1 2
| (*pPeople).name = “张三”; (*pPeople).id = “people_00001”;
|
方法二
这里指针没有解引用,所以用->
操作符,解引用了就可以用上面的().
操作符。
1 2 3 4 5 6
| pPeople -> name = “张三”; pPeople -> id = “people_00001”; pPeople -> sex = F; std::cout << pPeople -> name; std::cout << pPeople -> id; std::cout << pPeople -> sex;
|
操作实例
- 定义一个结构,至少存储:姓名、身份证、性别
- 实现文件存储
- 可以打印到屏幕
\b
C++中,\b是退格的意思,相当于你按了回退键Backspace。
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
| #include <iostream> #include <fstream> #include <windows.h> // 为了使用Sleep()函数
struct FishOil { std::string name; std::string uid; char sex; };
void InitFishC(); bool ReadFishC(); void RecordFishC(); bool WriteFishC(FishOil *OilData);
int main() { int i; InitFishC(); // 初始化数据。 while( 1 ) { std::cout << "请选择需要进行的操作: \n"; std::cout << "1. 打印数据到屏幕\n"; std::cout << "2. 录入数据\n"; std::cout << "3. 退出程序\n"; std::cin >> i; switch( i ) { case 1: if( ReadFishC() ) 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"; return 0; }
void InitFishC() { FishOil OilInit = {"小狐狸","0457",'M'};
if(WriteFishC(&OilInit)==false){ std::cout<<"初始化失败T_T\n"; } }
bool ReadFishC() { std::string temp; std::ifstream fileInput("FishC.txt");
if( fileInput.is_open() ){ std::cout << "\n 正在输出记录数据……" ; for(int i=0; i<=100;i++){//打印百分比 std::cout.width(3); std::cout<< i << "%"; Sleep(50); std::cout<< "\b\b\b\b"; } std::cout << "\n\n";
std::cout << "姓名" << "身份证" << "性别" << "\n\n";
while(std::getline(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 << "please input name:"; std::cin >> OilData.name; std::cout << "please input id:"; std::cin >> OilData.uid; std::cout << "please input sex:"; std::cin >> OilData.sex;
std::cout << "input success,store?(Y/N)"; std::cin >> Save; if('Y'==Save){ pOilData = &OilData; if(WriteFishC(pOilData)){ std::cout <<"成功写入文件\n";
} else{ std::cout <<"失败写入文件\n"; } }else{ return; }
std::cout << "/n请问需要再次录入吗?(Y/N)"; std::cin >> goon; } }
bool WriteFishC( FishOil *pOilData ) { std::ofstream fileOutput("FishC.txt", std::ios::app); //std::ios::app 说明在老数据追加新数据 if(fileOutput.is_open()){ fileOutput<< pOilData->name<<" "; fileOutput<< pOilData->uid<<" "; fileOutput<< pOilData->sex<<"\n";
fileOutput.close(); std::cout <<"数据成功保存到FishC.txt\n\n"; return true;
} else{ std::cout << "保存失败T_T_T\n"; return false; } }
|