【C++】IO流,双非渣本大数据开发四年磨一剑

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

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对象,

image-20220223224502229

  • operator bool函数没有返回值

image-20220709125602844

小例子:

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++根据文件内容的数据格式分为二进制文件和文本文件,采用文件流对象操作文件的一般步骤:

  1. 定义一个文件流对象
流对象(类)作用:
ofstream只写
ifstream只读
fstream读+写
  1. 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
打开方式功能
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;
};

下面的函数都可以写为类的成员函数

image-20220709151245520

image-20220709151304474

使用或的方式进行多种打开

例如:

以二进制形式写入数据模式为: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语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?

  1. 使用itoa()函数

image-20220223220227090

int a = 10;
char arr[10];
itoa(a,arr,10);//将整形a的转化为10进制字符数字存储在arr数组中


2.使用sprintf()函数

img

int a = 10;
char arr[10];
sprintf(arr,%d,a);//将整形a的转化为十进制基数格式存储在arr数组中


但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃


在C++中

可以使用stringstream类对象来避开此问题, 在程序中如果想要使用stringstream,必须要包含头文件sstream

在该头文件下,有标准库三个类:

作用
istringstream流的输入操作
ostringstream流的输出操作
stringstream输入操作+输出操作

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值