先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
正文
scanf/printf 的缺点是只支持内置类型. cin/cout真正优势是,自定义类型重载了operator>> 和operator<<之后,自定义类型对象也可也直接输出
6.在线OJ中的输入和输出:
- 对于IO类型的算法,一般都需要循环输入:
C语言的方式: 按ctrl+c终止程序
while(scanf("%d",&a) != EOF) //EOF->-1
{}
//或者写成:
while(~scanf("%d",&a)) //~(-1) ->0
{}
C++的方式 按ctrl+z + enter结束程序
// 单个元素循环输入
while(cin>>a)
{}
// 多个元素循环输入
while(cin>>a>>b>>c)
{}
// 整行接收
while(cin>>str) //operator>>(cin,str)
//istream& operator>>(istream& is,string& str) 返回流is对象
//流对象is调用operator bool函数,该函数没有返回值
{}
- operator>>(cin,str) -> 返回cin对象,
- operator bool函数没有返回值
小例子:
class A
{
public:
operator bool()
{
return _a != 0;
}
int _a;
};
int main()
{
A a;
while (a)//相当于a.operator bool()
{
cin >> a._a;
}
return 0;
}
此时也支持连续输入, 当输入0时停止, 因为operator bool的条件时 _a != 0
- 输出:严格按照题目的要求进行,多一个少一个空格都不行
C语言形式的读写
struct ServerInfo
{
char _ip[20];//保存ip地址
int _port;//端口号
};
//打开文件/关闭文件:fopen fclose
//文本读写:fprintf fscanf 二进制读写:fwrite fread
以二进制形式读写
以二进制形式写:
fwrite函数原型:
size_t fwrite ( const void \* ptr, size_t size, size_t count, FILE \* stream );
//ptr:指向写入的内容 size:每一个写入的内容是多少字节 count:写入多少个 stream:写到哪个流中
//以二进制形式写入
void TestC\_Write\_Bin()
{
ServerInfo info = { "127.1.1.1",10 };
FILE\* fout = fopen("test.bin", "wb");
//检查文件是否打开失败
//assert(fout);
if (NULL == fout)
{
perror("fopen");
exit(-1);
}
//写文件
fwrite(&info, sizeof(info), 1, fout);
fclose(fout);
}
以二进制形式读
fread函数原型:
size_t fread ( void \* ptr, size_t size, size_t count, FILE \* stream );
//ptr:从文件中读取放到ptr中 size:每一个读取的内容是多少字节 count:读取多少个 stream:从哪个流中读取
//以二进制形式读取
void TestC\_Read\_Bin()
{
FILE\* fin = fopen("test.bin", "rb");
//检查文件是否打开失败
//assert(fin);
if (NULL == fin)
{
perror("fopen");
exit(-1);
}
//读文件
ServerInfo info;
fread(&info, sizeof(info), 1, fin);
fclose(fin);
printf("%s:%d\n", info._ip, info._port);
}
测试:
int main()
{
TestC\_Write\_Bin();
TestC\_Read\_Bin(); //输出:127.1.1.1:10
return 0;
}
以文本形式读写
以文本形式写入
fprintf形式:
int fprintf ( FILE \* stream, const char \* format, ... );
写入的时候注意事项:要用空格/换行符区分每一个项
//以文本形式写
void TestC\_Write\_Text()
{
FILE\* fout = fopen("test.txt", "w");
//检查文件是否打开失败
//assert(fout);
if (NULL == fout)
{
perror("fopen");
exit(-1);
}
ServerInfo info = { "127.1.1.1",10 };
fprintf(fout, "%s %d", info._ip, info._port);//写入的时候,必须要有区分(空格/换行符)
//fprintf(fout, "%s\n%d", info.\_ip, info.\_port);
fclose(fout);
}
以文本形式读取:
fscanf形式:
int fscanf ( FILE \* stream, const char \* format, ... );
//以文本形式读
void TestC\_Read\_Text()
{
FILE\* fin = fopen("test.txt", "r");
//检查文件是否打开失败
//assert(fin);
if (NULL == fin)
{
perror("fopen");
exit(-1);
}
ServerInfo info;
fscanf(fin,"%s%d", info._ip, &info._port);//读取,注意:\_ip是数组名,所以不用加&,但是\_port是变量,要加&
fclose(fin);
printf("%s:%d\n", info._ip, info._port);
}
测试:
int main()
{
TestC\_Write\_Text();
TestC\_Read\_Text();//127.1.1.1:10
return 0;
}
C++文件IO流
C++根据文件内容的数据格式分为二进制文件和文本文件,采用文件流对象操作文件的一般步骤:
- 定义一个文件流对象
流对象(类) | 作用: |
---|---|
ofstream | 只写 |
ifstream | 只读 |
fstream | 读+写 |
- 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
打开方式 | 功能 |
---|---|
in | 以读的方式打开文件 |
out | 以写的方式打开文件 |
binary | 以二进制方式对文件进行操作 |
ate | 输出位置从文件的末尾开始 |
app | 以追加的方式对文件进行写入 |
trunc | 先将文件内容清空再打开文件 |
3.使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写
成员函数 | 功能 |
---|---|
put | 写入一个字符到文件中 |
write | 写入一段字符到文件 |
get | 从文件中读取字符 |
read | 从文件中读取多个字符 |
tellg | 获取当前字符在文件中的位置 |
seekg | 设置对文件进行操作的位置 |
>>运算符重载 | 将数据能像“流”一样的形式进行输入 |
<<运算符重载 | 将数据能像“流”一样的形式进行输出 |
4.关闭文件
C++形式的读写
class ConfigManager
{
public:
ConfigManager(const char\* filename)
:\_filename(filename)
{}
private:
string _filename;
};
下面的函数都可以写为类的成员函数
使用或的方式进行多种打开
例如:
以二进制形式写入数据模式为:ios_base::out | ios_base::binary
以二进制形式读取数据模式为:ios_base::in | ios_base::binary
以二进制形式读写
以二进制的形式对文件进行写入:
void WriteBin(ServerInfo& info)
{
ofstream ofs(_filename.c\_str(), ios_base::out | ios_base::binary);//构造流对象
ofs.write((const char\*)&info, sizeof(ServerInfo));//把info的内容写入到ofs流对象
}
以二进制的形式对文件进行读取:
void ReadBin(ServerInfo& info)
{
ifstream ifs(_filename.c\_str(), ios_base::in | ios_base::binary);
ifs.read((char\*)&info, sizeof(ServerInfo));//将内容读取到info
cout << info._ip << " " << info._port << endl;//验证是否读取了
}
测试 :
int main()
{
ConfigManager con("hello");
ServerInfo info = { "1.1.1",10 };
con.WriteBin(info);
con.ReadBin(info);//1.1.1 10
return 0;
}
不需要检查文件是否打开成功,因为如果失败了会抛异常
以文本形式读写
可以使用>> 和<< 对文件进行操作
以文本的形式对文件进行写入:
void WriteTest()
{
ofstream ofs("test.txt");//定义文件流对象,打开文件
ofs << "helloMango\n";//将字符串(流)到文件中
ofs.close();
}
以文本的形式对文件进行读取:
void ReadTest()
{
ifstream ifs("test.txt");//定义文件流对象,打开文件
string tmp;
ifs >> tmp;//把文件流得到数据读取到tmp,以空格/换行作为结束
ifs.close();
cout << tmp << endl;
}
C++特供写法:使用>> << 进行读写
4.stringstream的介绍
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?
- 使用itoa()函数
int a = 10;
char arr[10];
itoa(a,arr,10);//将整形a的转化为10进制字符数字存储在arr数组中
2.使用sprintf()函数
int a = 10;
char arr[10];
sprintf(arr,%d,a);//将整形a的转化为十进制基数格式存储在arr数组中
但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃
在C++中
可以使用stringstream类对象来避开此问题, 在程序中如果想要使用stringstream,必须要包含头文件sstream
在该头文件下,有标准库三个类:
类 | 作用 |
---|---|
istringstream | 流的输入操作 |
ostringstream | 流的输出操作 |
stringstream | 输入操作+输出操作 |
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
= 10;
char arr[10];
sprintf(arr,%d,a);//将整形a的转化为十进制基数格式存储在arr数组中
---
但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃
---
>
> 在C++中
>
>
>
可以使用stringstream类对象来避开此问题, 在程序中如果想要使用stringstream,必须要包含头文件sstream
在该头文件下,有标准库三个类:
| 类 | 作用 |
| --- | --- |
| istringstream | 流的输入操作 |
| ostringstream | 流的输出操作 |
| stringstream | 输入操作+输出操作 |
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-TfNLK9Q2-1713338130459)]
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**