当前位置: 首页 > news >正文

邢台做网站的那好网站优化效果

邢台做网站的那好,网站优化效果,建立网站准备工作,网站的前端和后台一起来康康C中的文件IO操作吧 文章目录1.operator bool2.C文件IO流3.文件操作3.0 关于按位与的说明3.1 ifstream3.2 ofstream流插入文本3.3 ostringstream/istringstream3.4 stringstream3.5使用stringstream的注意事项结语1.operator bool 之前写OJ的时候,就已经用…

一起来康康C++中的文件IO操作吧

文章目录

  • 1.operator bool
  • 2.C++文件IO流
  • 3.文件操作
    • 3.0 关于按位与的说明
    • 3.1 ifstream
    • 3.2 ofstream
      • 流插入文本
    • 3.3 ostringstream/istringstream
    • 3.4 stringstream
    • 3.5使用stringstream的注意事项
  • 结语

1.operator bool

之前写OJ的时候,就已经用过上面这种方式来获取多组测试用例

string s;
while(cin>>s)
{cout << s << endl;
}

不过之前一直没有去了解这里的底层原理是什么,借此机会一并说明

io流可以进行while判断的依据,是因为库的源码中重载了operator bool

image-20221021083819728

没错,operator不仅可以重载一个操作符,它还可以重载一个类型!即将这个类转换为bool类型,return 一个bool类型的值用于while的判断

同理,重载int/double这些类型都是可行的!

另外,要想停止上面的多组输入,在VS下可以用ctrl+z的方式解决,而不要用ctrl+c直接杀掉进程


2.C++文件IO流

image-20221021084123029

C++的文件io类设计的较为复杂,其中还出现了菱形继承,也就是我们最常用的iostream

上面提到的operator bool就是基类IOS实现的,子类都没有去重写

  • cout为标准输出,将数据从内存流中输入到显示器上
  • cin为标准输入,通过键盘输入数据到程序中
  • cerr用于标准错误的输出
  • clog进行日志输出

其中需要注意的一点是,空格和回车会被当作数据之间的分隔符,所以字符串中不能有空格,回车和空格也不能通过cin读入

如果需要读入带空格的完整一行,可以使用getline函数

  • 为什么cin和cout可以输入输出所有类型?

因为库里面已经将所有类型通过操作符重载<<>>实现了,达到了自动类型识别的效果

3.文件操作

C++标准库中提供的打开方式如下,我们可以根据不同情况传入不同的值,或者一次性用按位或|传入多个打开方法

image-20221021131806044

同时因为C++类和对象会自动调用析构函数,所以我们也不需要手动close文件

3.0 关于按位与的说明

这里为何可以用按位与传入多个方法?

假设这些方法就是简单的数字2/4/8(必须是2的倍数)我们可以通过按位与了之后,在按位或,判断某一个数字是否在其中

image-20221021134429643

如果或了之后的数字等于它本身,说明数据在其中!

  • 为什么需要是2的倍数呢?

image-20221022102400142

这种方法在linux中常见,比如linux系统的文件接口

3.1 ifstream

image-20221021130324611

这个对象是用于读取文件的,默认情况下,传入的打开方法为in

void test1()
{ifstream ifs("test.txt");while (ifs){char ch = ifs.get();cout << ch;}
}

image-20221021131949014

因为重载了bool,所以可以很方便的直接用while来判断结束,成功输出了文件中的内容

	ifstream ifs("test.txt");char ch;while (ifs >> ch){cout << ch;}

第二种读取方法采用了流插入>>上面提到过,流提取和插入的时候,会把空格和换行当作数据的分隔符,所以它是不能打印出空格和换行

image-20221021132102499

3.2 ofstream

image-20221021200201898

写文件的方式同上,用out方法打开文件就可以了(默认传的就是out)

	ofstream ifs2("test1.txt",ios::out);char str[] = "i love u\n";ifs2.write(str,sizeof(str));

image-20221021133644760

不过这个和C语言的w方法一样,写入的时候会覆盖文件中已有的内容。如果想进行追加,则需要在后面加上app;如果是执行二进制读写,则需要与上ios::binary

	ofstream ifs2("test1.txt",ios::out|ios::app);char str[] = "i love u";ifs2.write(str,sizeof(str));

image-20221021133902913

运行成功后会在文件尾部追加内容

注意,这里的字符串不能用string进行处理,因为string内部只存了一个指向字符串空间的指针,写入string相当于把指针写入进文件中,是么有用的!

image-20221021135154450

流插入文本

但是,如果我们用<<进行提取的时候,就可以用string了

void test2()
{ifstream ifs("test.txt");ofstream ofs("test1.txt");char ch;ch = ifs.get();while (~ch){ofs << ch;cout << ch;ch = ifs.get();}string s("i love you");ofs << s;
}

程序运行后,会把test.txt中的内容输出到控制台,同时写入到test1.txt

最后还会写入一个string的内容

image-20221021200810379

这是因为我们调用<<的时候,就和cin<<s一样,调用的是string重载的流提取操作符

底层实现的时候会将其转为C语言的字符串,从而写入到了文件中

所以当我们需要写入一个自定义类型的时候,可以重载流提取操作符,不仅可以更方便的打印,还可以写入到文件中


3.3 ostringstream/istringstream

这个类可以将不同的类型转为字符串

这种操作被称为序列化和反序列化,在处理自定义类型的时候非常好用

struct Date
{
public:friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);Date(int y=0, int m=0, int d=0){_year = y;_month = m;_day = d;}
private:int _year;int _month;int _day;
};istream& operator >> (istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}ostream& operator << (ostream& out, const Date& d)
{out << d._year << " " << d._month << " " << d._day;return out;
}void test4()
{int i = 123;double d = 44.55;ostringstream oss;//序列化oss << i;string stri = oss.str();oss.str("");//清空ossoss << d;string strd = oss.str();cout << strd<< endl;oss.str("");//清空ossDate d1(2022, 10, 11);oss << d1;string strdt = oss.str();cout << strdt << endl;istringstream iss(strdt);//反序列Date d2;iss >> d2;cout << d2 << endl;
}

image-20221021202021334

3.4 stringstream

这个对象可以用于字符串拼接,也可以用来将其他类型转为str

	stringstream sstream;// 将多个字符串放入 sstream 中sstream << "first" << " " << "string,";sstream << " second string";cout << "strResult is: " << sstream.str() << endl;// 清空 sstreamsstream.str("");sstream << "third string";cout << endl;cout << "After clear, strResult is: " << sstream.str() << endl;

image-20221021202846449

3.5使用stringstream的注意事项

  • stringstream实现转换,实际上是维护了一个string对象实现的

  • 我们可以使用str("")清空里面的string对象,设置为空字符串

  • 多次数据类型转换的时候,需要用clear()来清空,才能正确转换。不过clear()不会清空底层的string对象

  • 因为使用的是string对象,所以使用的时候不需要格式化控制,可以自动推导类型

stringstreams在转换结尾时(即最后一个转换后),会将其内部状态设置为badbit
因此下一次转换是必须调用clear()将状态重置为goodbit才可以继续转换

image-20221021203337884

这里在第一次调用stringstream操作后,我们没有进行clear,会发现后续的double类型转换失败了

image-20221021203409171

执行了clear之后,转换成功!

结语

关于C++IO流操作的基本认识到这里就over了。

因为在实际中用的并不算多,所以这部分的内容大多数是了解一二,知道如何使用,以及3.0中提到的按位与操作是怎么实现的就OK了!

http://www.yayakq.cn/news/530902/

相关文章:

  • 网站 免费空间wordpress author.php
  • html5网站制作软件主流的网站开发工具
  • 个人网站制作成品凡科建站模板
  • 怎么建立网站 个人电商设计怎么样
  • 好网站建设公司服务wordpress分类加密
  • 北京营销网站建设优化关键词排名哪家好
  • 贵阳网站设计详细解读浦口区建设局网站
  • SEO与网站建设创意寓意好的公司名字
  • 万网 网站托管免费1级做看网站
  • 陕西交通建设集团蓝商公司网站百度网址大全下载安装
  • 全国推广优化网站小程序免费制作平台教学
  • 做网站的一般多钱php网站服务建设
  • 本地怎样上传自己做的网站移动互联网站开发与维护招聘
  • 网站建设 移动端建设网站的具体步骤是什么
  • 网站开发流程文档百度站长工具怎么关闭
  • 盘锦建网站抖音代运营公司排名前十强
  • 网站建设制作苏州怎样做网站建设的程序
  • wordpress建站教程第六节线上销售技巧
  • 郑州建网站费用网站后台密码是什么
  • 云网站建站网站开发教育
  • 网站多个域名备案朝阳发布
  • 建设网站的行业现状分析家装公司成都
  • 网站设计 验收标准外汇跟单社区网站开发
  • 网站空间多大合适网络营销未来有哪些发展趋势
  • 普陀手机网站建设文学网站开发设计报告
  • 运动网站模板做运动户外的网站都有哪些
  • 湘潭大学迎新自助网站微模板如何建微网站
  • 深圳如何搭建制作网站新冠为什么莫名消失了
  • 小型手机网站建设企业深圳免费网站优化网络推广
  • 电子商务网站建设期末试题未来网登录网址