C++入门到进阶(图文详解,持续更新中)
目录
数据
数据类型
基本数据类型/内置数据类型
整型:有符号与无符号
int
unsignedf int
long
unsigned long int
short int
ushort
byte
sbyte
long int
unsigned long int
浮点型/实型:
float
double
long double
字符型:
char
布尔型:
bool
C++常用运算符
赋值运算符
基本赋值运算符:=
复合赋值运算符:+=(加赋值)、-=(减赋值)、*=(乘赋值)、/=(除赋值)、%=(求余赋值)、 <<=(左移赋值)、>>=(右移赋值)、&=(按位与赋值)、|=(按位或赋值)、*A=(按位异或赋值)
关系运算符
== != < > <= >=
逻辑运算符
&& || !
杂项运算符
sizeof和三目运算符
数据的本地化存储
一、准备工作:
实现本地化存储需要
头文件为:iostream,ofstream
引入头文件
#include<iostream>
#include<ofstream>
命名空间为:std
引入命名空间:
using namespace std;
二、写流即向本地文件中写入数据该如何实现?
使用ofstream的方法,操作步骤为:
1.创建写流的对象或创建写流的变量
ofstream ofs;
2.打开文件执行,准备执行写数据(称为开流)
ofs.open("abc.txt", ios::out);
3.对本地写数据
string name;
getline(cin, name,'q');
ofs << name << endl;
4.关闭流
ofs.close();
三、读流(即从本地文件中读取数据)
1.创建读流对象
ifstream ifs;
2.打开文件准备读取数据(称为开流)
ifs.open("abc.txt", ios::in);
3.开始从本地读取数据
方法1:
char ValueArrays[1024]{};while (ifs >> ValueArrays)//非零即为真
{
cout << ValueArrays << endl;//这是字符串的打印
}方法2:
string str = " ";
while (ifs >> str)
{
cout << str << endl;
}
4.关闭流
ifs.close();
存储案例展示:(存储数据到UserInfo的txt文本中,读取数据,新增数据,查找相关姓名、年龄、地址)
#include <iostream>
#include<fstream>
#include<string>
#include"User.h"
/*
预处理
#include中的" "和<>的使用
<>:代表的导入C++库文件
“ ”:先检索是否有没有自己写的头文件,如果检索不到自己写的头文件,会自动查找C++库,找不到就报错
*/
using namespace std;
void Save()
{
using namespace std;
ofstream ofs;
ofs.open("abc.txt", ios::out);
string name;
getline(cin, name,'q');
ofs << name << endl;
ofs.close();
}
int name_index = 0;
void Add(string nameArrays[])//name是一个形参,需要一个string 类型数组的地址
{
string name = " ";
cin >> name;
nameArrays[name_index] = name;
name_index++;
ofstream ofs;
ofs.open("abc.txt", ios::out);
for (int i = 0; i < name_index; i++)
{
ofs << nameArrays[i] << endl;
}
ofs.close();
}
void GetValue()
{
using namespace std;
//1. 创建对象
ifstream ifs;
//2. 开流
ifs.open("abc.txt", ios::in);
//3.读取数据,方法1
//3.1数据本地读取出来了,需要找到一个容器去存放读取出来的数据
char ValueArrays[1024]{};
//3.2开始取出数据,并将本地数据在数据中
while (ifs >> ValueArrays)//非零即为真
{
cout << ValueArrays << endl;//这是字符串的打印
}
ifs.close();
cout << "---------" << endl;
//3.读取数据,方法2
//3.1数据本地读取出来了,需要找到一个容器去存放读取出来的数据
//读取不走回头路
ifs.open("abc.txt", ios::in);
string str = " ";
while (ifs >> str)
{
cout << str << endl;
}
ifs.close();
cout << "--------" << endl;
//3.读取数据,方法3 借助一个ifstream里的一个函数getline
ifs.open("abc.txt", ios::in);
char buf[1024]{};
while (ifs.getline(buf, sizeof(buf)))//getline是ifstream下的一个函数,用于获取到一行数据,函数的第一个参数是用于接收一行数据的字符数组,
//第二个参数是用于接收数据的容器的大小
{
cout << buf << endl;
}
ifs.close();
cout << "--------" << endl;
//3.读取数据,方法4 借助一个string里的一个函数getline
ifs.open("abc.txt", ios::in);
string str_buf = {};
while (getline(ifs, str_buf))
{
cout << str_buf << endl;
}
ifs.close();
cout << "--------" << endl;
//3.读取数据,方法5 借助一个ifstream里的一个函数eof
ifs.open("abc.txt", ios::in);
char eof_buf[1024]{};
while (!ifs.eof())
{
ifs >> eof_buf;
cout << eof_buf << endl;
}
ifs.close();
}
void SetValue()
{
string name = " ";
string age = " ";
string address = " ";
cout << "请输入姓名:" << endl;
cin >> name;
cout << "请输入年龄:" << endl;
cin >> age;
cout << "请输入地址:" << endl;
cin >> address;
ofstream ofs;
ofs.open("Value.txt", ios::out);
ofs << name << " ";
ofs << age << " ";
ofs << address << endl;
ofs.close();
}
void SelValue()
{
string r_name = " ";
string r_age = " ";
string r_address = " ";
ifstream ifs;
ifs.open("Value.txt", ios::in);
while (ifs >> r_name && ifs >> r_age && ifs >> r_address)
{
cout << "姓名:" << r_name << ",年龄:" << r_age << ",地址:" << r_address << endl;
}
ifs.close();
}
//增加用户
User uArray[6] = {};
int uSize = 0;
void AddUser()
{
string name;
int age;
string address;
cout << "输入姓名:" << endl;
cin >> name;
cout << "输入年龄:" << endl;
cin >> age;
cout << "输入地址:" << endl;
cin >> address;
User uInstance;
uInstance.name = name;
uInstance.age = age;
uInstance.address = address;
uArray[uSize] = uInstance;
uSize++;
ofstream ofs;
ofs.open("UserInfo.txt", ios::out);
for (int i = 0; i < uSize; i++)
{
ofs << uArray[i].name << " ";
ofs << uArray[i].age << " ";
ofs << uArray[i].address << endl;
}
ofs.close();
}
int Find(string name)
{
for (int i = 0; i < uSize; i++)
{
if (uArray[i].name == name)
{
return i;
}
}
return -1;
}
//查询所有人的所有信息
void SelAllUser()
{
ifstream ifs;
ifs.open("UserInfo.txt", ios::in);
//is_open判断上一行代码中打开的文件是否存在
//存在返回真,不存在返回假
/*if (ifs.is_open())
{
cout << "文件存在" << endl;
}
else
cout << "文件不存在" << endl;*/
if (!ifs.is_open())
{
cout << "文件不存在" << endl;
return;//文件不存在,下方逻辑不用执行
}
char buf[1024];
ifs >> buf;
if (ifs.eof())
{
cout << "文件存在,但没数据" << endl;
return;//下方逻辑无需进行
}
ifs.close();
ifs.open("UserInfo.txt", ios::in);
int i = 1;
string name;
int age;
string address;
while (ifs >> name && ifs >> age && ifs >> address)
{
cout << "第" << i << "人的姓名是" << name << ",年龄是" << age << ",地址是" << address << endl;
}
}
//查询某个人的所有信息
void SelUser()
{
cout << "输入名字" << endl;
string sel_name = " ";
cin >> sel_name;
int index = Find(sel_name);//Find()会返回一个int类型的值
if (index != -1) {}//
ifstream ifs;
ifs.open("UserInfo.txt", ios::in);
string name = " ";
int age = 0;
string address = " ";
while (ifs >> name && ifs >> age && ifs >> address)
{
if (name == sel_name)
{
cout << "用户名为:" << name << ",年龄是:" << age << ",地址是:" << address << endl;
}
}
}
//初始化
int Init()
{
ifstream ifs;
ifs.open("UserInfo.txt", ios::in);
if (!ifs.is_open())
{
cout << "文件不存在" << endl;
return -1;//文件不存在,下方逻辑不用执行
}
char buf[1024];
ifs >> buf;
if (ifs.eof())
{
cout << "文件存在,但没数据" << endl;
return -1;//下方逻辑无需进行
}
ifs.close();
ifs.open("UserInfo.txt", ios::in);
int i = 0;
string name;
int age;
string address;
while (ifs >> name && ifs >> age && ifs >> address)
{
uArray[i].name = name;
uArray[i].age = age;
uArray[i].address = address;
i++;
}
return i;
}
int main()
{
//string str = {};
//getline(cin, str, 'q');//控制台输入数据,赋值到str中,按q键再按回车键结束
//getline(cin, str, '\t');//控制台输入数据,赋值到str中,按Tab键然后再按回车结束
//cout << str << endl;
//Save();
//GetValue();
//SetValue();
// SelValue();
int addIndex = Init();
while (true) {
cout << "添加:1,查询:2,退出:0" << endl;
int selecter;
cin >> selecter;
switch (selecter)
{
case 0:
exit;
break;
case 1:
AddUser();
break;
case 2:
SelAllUser();
break;
}
}
system("pause");
}
函数
函数的声明和定义
函数声明的作用:代表的是函数的出生位置(占位置的),如果在文件最上方的位置声明了函数,不用担心函数和函数之间互相调用编译不通过的问题
函数的定义:为函数声明写函数体(写逻辑)
注 :可能出现的bug,函数只有声明,没有定义,这个函数却被调用了,被编译时期的异常error
函数传值
传出数据(即返回值)
作用:在函数内传数据出函数
样式:
返回类型 函数名称(参数)
{
return 对应返回类型的值;
//此处的return有双重作用:
1.跳转语句(跳出函数)
2.返回值
}
可以返回的值:
1.对应返回类型的值
2.对应返回类型的变量
3.带同种返回类型返回值的函数调用——先执行函数调用,再返回值
传入数据(即传参)
1.什么是传参?
传参就是实参传入形参
2.作用
在函数外部传入数据到函数内部
3.类型
形参:在函数声明和定义的时候写的是行参
实参:在函数调用的时候 传递的值是实参
实参的种类:
(1)对应形参类型的值
(2)对应形参类型的变量
(3)带同种返回类型返回值的函数调用,即先执行函数调用,再传参数(实参传参数)
4.关于形参在函数声明和函数定义中注意点
(1)声明的形参参数名称和定义的形参参数名称
(2)可以不一样声明的时候可以省略参数名称
(3)如果存在函数的默参,默认是必须写在函数声明位置的,不可以在声明和定义中都写一遍默参
5.默参
作用:函数可以在声明或者定义的时候给出默认的逻辑执行
关于默参的放置位置说明
如果只有一个默参
放在参数结尾处(最右侧)
如果有多个默参
从右到左依次给出默参,中间不可以隔开使用
错误演示:void Function(int i=10,int a,bool b=false)
正确演示::void Function(int i=10,int a=10,bool b=false)
6.函数重载
函数名相同,但是函数参数(参数类型)不同,通过传入不同的实参,调用不同的函数,执行不同的功能
注意:
函数返回值不参与函数重载的过程
如果被重载的函数中出现了默参
建议不要写成重载函数
如果不接受建议,就需要保证默参的几个参数类型与其他被重载的函数的参数不一致
7.传参方式
(1)值传递:值传递只能影响本函数,值的修改不会影响其他的功能,也不会影响到实参
(2)地址传递
(3)引用传递
面向对象
待更新.....