长安的花

当学问走过漫漫古道
凿刻入千窟,心也从愚昧中苏醒

0%

c++学习10-结构

结构

结构(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;
}
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道