C++程序把输入和输出看作字节流。输入时,程序从输入流中抽取字节;输出时,程序将字节插入到输出流中。流充当了程序和流源或流目标之间的桥梁。C++程序只是检查字节流,而不需要知道字节来自何方和去向何处。使用缓冲区可以更高效地处理输入和输出。
C++ IO首先建立在为Unix环境开发的原始库函数上;ANSI C正式承认这个库时,将其称为标准输入/输出包;
C语言里面对文件的操作是通过文件指针,以及一些相关的函数,那么C++中是如何对文件进行操作的呢?没错,就是通过 fstream 这个文件流来实现的。当我们使用#include 时,我们就可以使用其中的 ifstream,ofstream以及fstream 这三个类了(ofstream是从内存到硬盘,ifstream是从硬盘到内存),也就可以用这三个类来定义相应的对象了,这三个类分别代表一个输入文件,一个输出文件,以及一个输入输出文件。Ifstream类支持>>操作符,ofstream类支持<<操作符,fstream类同时支持>>和<<操作符。
c++标准库对于流定义了一套它自己的状态变化规则,在ios_base.h声明的ios_base类中,它定义了一个枚举类型_Ios_Iostate来表示流状态,主要有以下四种:
函数原型:istream& getline ( istream &is , string &str , char delim );
输入输出是每一种编程语言必不可少的部分,c++也不例外,下面我们就来说明c++的标准输入输出的前世今生。
iostream文件定义了用于管理输入和输出的类、常量和操作符,这些对象用于I/O的流和缓冲区。该文件还创建了一些用于处理标准输入输出流的标准对象(如cin、cout、cerr和clog以及对应的宽字符对象)。
首先,很多C++程序员从lambda 用法上反推容易发现是对象,因为lambda可以捕获!这是函数做不到的。的确,比如:
istringstream是由一个string对象构造而来,istringstream类从一个string对象读取字符。 istringstream的构造函数原形如下: istringstream::istringstream(string str); //程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者 #include <iostream> #include <sstream> using namespace std; int main() { istringstream istr; istr.str("1 56.7",); //上述两个过程可以简单写成 istringstream istr("1 56.7"); cout << istr.str()<<endl; int a; float b; istr>>a; cout<<a<<endl; istr>>b; cout<<b<<endl; system("pause"); } 上例中,构造字符串流的时候,空格会成为字符串参数的内部分界,例子中对a,b对象的输入"赋值"操作证明了这一点,字符串的空格成为了整型数据与浮点型数据的分解点,利用分界获取的方法我们事实上完成了字符串到整型对象与浮点型对象的拆分转换过程。 str()成员函数的使用可以让istringstream对象返回一个string字符串(例如本例中的输出操作(cout<<istr.str();)。 ostringstream同样是由一个string对象构造而来,ostringstream类向一个string插入字符。 ostringstream的构造函数原形如下: ostringstream::ostringstream(string str); 示例代码如下: //程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者 #include <iostream> #include <sstream> #include <string> using namespace std; int main() { ostringstream ostr; //ostr.str("abc");//如果构造的时候设置了字符串参数,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长 ostr.put('d'); ostr.put('e'); ostr<<"fg"; string gstr = ostr.str(); cout<<gstr; system("pause"); } 在上例代码中,我们通过put()或者左移操作符可以不断向ostr插入单个字符或者是字符串,通过str()函数返回增长过后的完整字符串数据,但值得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。 对于stringstream了来说,不用我多说,大家也已经知道它是用于C++风格的字符串的输入输出的。 stringstream的构造函数原形如下: stringstream::stringstream(string str); 示例代码如下: //程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者 #include <iostream> #include <sstream> #include <string> using namespace std; int main() { stringstream ostr("ccc"); ostr.put('d'); ostr.put('e'); ostr<<"fg"; string gstr = ostr.str(); cout<<gstr<<endl; char a; ostr>>a; cout<<a system("pause"); } 除此而外,stringstream类的对象我们还常用它进行string与各种内置类型数据之间的转换。 示例代码如下: //程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,
答案是:链接方式 1 产生的 main 输出 specialization,链接方式 2 产生的 main 输出 normal。
【注:以默认模式打开文件(即上述方式)进行输出将自动把文件的长度截短为零,这相当于删除已有的内容。具体原因见本文第三节文件模式中的注】
在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/
下图中 ios 是 输入 / 输出 流 基类 , 含义是 input - output - stream ;
在C++中,所有的输入输出操作大部分都继承自 ios_base 基类,详细的继承体系如下图所示
在看本文之前,建议先看一下之前的一篇文章,至少要知道标准IO里面各个类之间的关系:
你好,我是雨乐! 最近在知乎上看了篇帖子,题目是为什么C++没有C语言快,如下图: 恰好之前研究过这块,所以借助本文,分析下这个问题(无意于语言之争,单纯是从技术角度😁)。 众所周知,C++兼容了C的所有功能,显然从所有角度去对比分析是不现实的,所以本文从我们常用的输入输出即标准流(iostream和stdio)的角度来分析讲解。 示例 为了更加直观地来对比分析,写了个示例,通过scanf和cin读文件,然后分析两种方式的性能高低,代码如下: #include <chrono> #include <fu
git clone https://github.com/changkun/modern-cpp-tutorial.git
IO流使用cout进行输出cout格式化调整字节宽度以及填充字符setf()相关字符串流文件流
讲个“惊悚的故事”,我本科所学的C++,现在高校还是那么讲的,教材几乎没啥大变化。
我想比较一下 C++ 和 Python 的标准输入,但实验的结果让人大吃一惊,C++ 慢了许多。下面是我的实验代码:
在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结:
上面错误时,一般是因为使用C的front-end去编译C++代码。使用gcc编译C++代码,它没有链接C++的liberies.例如:
ostream类是从ios类派生而来,ios类是从ios_base类派生而来。ios_base类存储了描述格式状态的信息,例如一个类成员中某些位决定使用哪个计数系统(如八/十/十六进制),另外一个成员决定字段的宽度,且ios_base是ostream间接基类,因此ostream也可以修改计数系统和字段宽度。
1.this 指针 在简单的程序中,类成员函数通常涉及一个对象,但是复杂时有可能涉及两个对象,这种情况就要用到指针。 多说无益,look!
原因是当address比较长的时候,string对象,字符串会存在堆里面,ptr指针指向这个字符串,但是写到文件里面的时候,写的不是堆的内存,而是ptr这个地址。
七种基本的C++数据类型:bool、char、int、float、double、void、wchar_t 类型修饰符:signed、unsigned、short、long 注:一些基本类型可以使用一个或多个类型修饰符进行修饰,比如:signed short int简写为short、signed long int 简写为long。
IO 类型之间的关系 设备类型和字符大小都不会影响IO操作,我们可以使用 >> 读取数据,不用关系是从控制台窗口,一个磁盘文件还是一个 string 对象。也不用关心使用char对象去存储还是使用wchar_t对象去存储。 因为有继承机制和模板,我们可以忽略不同流之间的差异。
https://zetaoyang.github.io/post/2016/11/05/linux-shared-object.html
凡是涉及STL的错误都不堪入目,因为首先STL中有复杂的层次关系,在错误信息中都会暴露出来,其次这么多类和函数的名字大多都是双下划线开头的,一般人看得不习惯。
C++是一种面向对象的编程语言,由Bjarne Stroustrup在20世纪80年代初开发。它是在C语言的基础上增加了面向对象的特性,从而既具有C语言的高效性,又提供了高级的编程抽象。C++已经成为许多系统级软件、游戏、嵌入式系统以及高性能计算应用程序的主要编程语言。
C++的多继承是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。从概念上来讲这是非常简单的,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个,比如典型的是菱形继承,如图2-1所示:
本文总结了几乎所有不易理解或是容易忘记的C++知识,可作为手册查阅,内容参考自清华大学郑莉教授的C++课程。
每个IO 对象都维护一组条件状态 flags (eofbit, failbit and badbit),用来指出此对象上是否可以进行 IO 操作。如果遇到错误—例如输入流遇到了文件末尾,则对象的状态变为是失效,所有的后续输入操作都不能执行,直到错误纠正。
我们经常使用ofstream或者fstream可写文件,使用ifstream可以写文件,但需要设置文件的打开状态为ios::out。C++中IO流打开模式使用位掩码来表示。IO流打开模式有:
我们所熟悉的输入输出操作分别是由istream(输入流)和ostream(输出流)这两个类提供的,为了允许双向的输入/输出,由istream和ostream派生出了iostream类。 类的继承关系见下图:
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。
c++的文件流处理其实很简单,前提是你能够理解它。文件流本质是利用了一个buffer中间层。有点类似标准输出和标准输入一样。
昨天的文章中叙述了C++17的文件系统操作,极大的方便了对于文件夹的操作,见链接[现代C++]文件系统操作。今天将更深一步的讲解文件的读写。
在我的印象中,getline函数经常出现在自己的视野里,模糊地记得它经常用来读取字符串 。但是又对它的参数不是很了解,今天又用到了getline函数,现在来细细地总结一下: 首先要明白设计getline函数的目的,其实很简单,就是从流中读取字符串。而且读取的方 式有很多,包括根据限定符,根据已读取的字符的个数。从这个函数的名称来看,它的直观 意义是从流中读取一行,但是大家不要被这表面的现象所迷惑。其实如果让我来为这个函数 去一个名字的话,或许我会取一个getString,因为它的目的本来就是从流中读取字符的
fstream是C++标准库中面向对象库的一个,用于操作流式文件。 fstream本质上是一个class,提供file操作的各种方法。
凡经历过iOS面试的我们总会发觉,即使实际开发中做过许多项目,也难免为一个普通的面试题受挫。这也许不是因为我们技术不过关,而是因为在平时我们忽略了怎样将用到的知识很好的表述出来。闲暇之余我把一些常见的iOS面试问题总结一下,即使不是为了面试,也有助于对基础知识的回顾。 此篇总结在iOS中遇到的有关概念或功能相似的,容易混淆的知识点: 1.区分UDID与UUID UDID(Unique Device Identifier)用户设备唯一编码 UDID是一串由40位16进制数组成的字符串,用以标识唯一的设备。
作为一名C++面试官,问的最多的问题就是说说多态的实现机制,无非想听到的答案就是虚函数以及虚函数表,也算是烂大街的问题了,稍微有点经验的候选人都会答上个一二三。今天,借助本文,我们聊聊实现多态的几个方式。
提起Windows共享本地摄像头,好多人想到的是通过ffmepg或vlc串流到服务器,实际上,用轻量级RTSP服务更简单,本文就介绍下,如何用大牛直播SDK的Windows轻量级RTSP服务,采集摄像头,生成本地RTSP串流,供其他终端访问。
我想看本文的人有很大一部分都是 android 工程师,所以在讲干货之前,我需要讲一讲方法论
从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态。
fstream属于C++标准,使用fstream进行文件读写,具有跨平台性。使用过程中要注意几点:
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
配套视频: https://www.bilibili.com/video/BV1et411b73Z 只是为方便学习,不做其他用途,在此发布C++基础入门部分配套讲义,原作者为黑马程序
领取专属 10元无门槛券
手把手带您无忧上云