下列有关io操作的叙述中错误的是,c语言标准io库
第八章IO库本章我们只对C中的IO库,相关流类的使用以及它们的特点和概念有一个大概的了解。关于文件操作更详细的细节后面会研究,所以我们不必过分严格要求自己掌握文件操作。简而言之,我们在这里学到的是c对IO的一些封装。
c不直接处理输入输出,而是通过标准库中定义的一系列类型来处理IO。这些类型支持从设备(如文件、控制台窗口等)读取数据和向设备写入数据的IO操作。
还有一些类型允许操作内存IO,即从string中读取数据,向string中写入数据。
我们已经联系上了。
Istream输入流类型,提供输入操作。Ostream输出流类型,提供输出操作。
Cin是一个从标准输入中读取数据的istream对象。
Cout是一个ostream对象,它将数据写入标准输出。
Cerr是一个ostream对象,通常用于输出程序错误信息并将其写入标准错误。
运算符从istream对象中读取输入数据。
运算符将输出数据写入ostream对象。
Getline函数,它从给定的istream中读取一行数据,并将其存储在给定的string对象中。
IO类首先需要知道下面这些东西一般有什么用。
W是支持使用宽字符的语言,C定义了一组类来操作wchar_t类型的数据,宽字符版本类型和函数以W开头,比如wcin,wcout,wcerr。
//示例1.cpp
#包括
使用命名空间std
int main(int argc,char**argv){
wstring名称;
wcin名称;//你好
wcout名称endl//你好
cout name . length()endl;//4
返回0;
IO类型之间的关系仅通过继承机制在iostream之间有所不同。所有输入流的基类是istream,所有输出流的基类是ostream。
IO对象没有副本或赋值。简而言之,IO对象不能赋值。因为不能复制,所以参数或返回类型不能设置为流类型。
通常是通过引用传递和返回,因为读写对象会改变其状态,传递和返回的引用不能是const。
条件流对象有自己的状态,称为操作流的条件状态。
不懂也没关系。只有你知道是这样,会议的学习才会真正被用到。
//示例2.cpp
#包括
使用命名空间std
int main(int argc,char**argv){
cout CIN . eof()endl;//0
cout CIN . fail()endl;//0
cout CIN . good()endl;//1此时,流状态位goodbit为1。
STD:IOs _ base:iostate state=STD:IOs _ base:fail bit;
cin.setstate(状态);
//读取条件状态
cout(CIN . rd state()==STD:IOs _ base:fail bit)endl;//1
cout(CIN . rd state()==CIN . fail bit)endl;//1
cout CIN . good()endl;//0
返回0;
}实际使用
//示例3.cpp
#包括
使用命名空间std
int main(int argc,char**argv){
int I;
cin一世;//g
cout CIN . good()endl;//0
cout i endl//0
cin一世;//它不会正常执行,因为cin的状态已经不对了。
cout CIN . good()endl;//0
返回0;
}如果流操作放在需要布尔检查的地方,比如if或者while,那么流的状态就会被检查。
//示例4.cpp
#包括
使用命名空间std
int main(int argc,char**argv){
int I;
如果(cin一世){
cout i endl
}
//输入e输出无
//输入3输出3
返回0;
}管理条件状态,读取条件状态,使用rdstate()方法,使用clear()恢复默认状态,使用setstate设置状态。
//示例5.cpp
#包括
使用命名空间std
int main(int argc,char**argv){
auto old _ state=CIN . rd state();
CIN . clear();//恢复默认条件状态
CIN . setstate(old _ state);
//其他标志位在复位期间可以保持不变。
CIN . clear(CIN . rd state()~ CIN . fail bit ~ CIN . bad bit);
//辅助位failbit和badbit保持其他标志位不变。
返回0;
}管理输出缓冲区每个输出流管理一个缓冲区来保存程序读写的数据。
操作系统“hello world”;文本可以立即打印,也可以保存在缓冲区中,以后再打印。
操作系统可以将多个程序的多个输出操作合并成一个系统级的写操作,提高了效率。
缓冲区刷新有许多原因,即数据实际上是从输出设备或文件中写出的。
程序正常结束。作为main函数返回操作的一部分,当缓冲区被刷新时,使用endl显式地刷新缓冲区。在每次输出操作之后,可以使用操作符unitbuf来设置流的内部状态,以清空缓冲区。cerr默认是用unitbuf设置的,所以写入cerr的内容会立即输出。一个输出流可能与另一个流相关。当读取和写入关联流时,关联流的缓冲区将被刷新。例如,cin和cerr都与cout相关,因此读取cin或写入cerr会导致cout的缓冲区被刷新。//示例6.cpp
#包括
使用命名空间std
int main(int argc,char **argv)
{
cout hello world endl//输出被包装,然后被刷新
cout“hello world”同花顺;//输出然后刷新
cout“hello world”结束;//向输出中添加一个空字符,然后刷新
//你好世界
//hello worldhello world
返回0;
}unitbuf运算符//example7.cpp
#包括
使用命名空间std
int main(int argc,char**argv){
cout unitbuf
cout的所有写操作都会立即刷新缓冲区,即立即输出。
//即cout不再使用缓冲区
cout‘hello world’;//你好世界
cout nounitbuf//恢复缓冲模式。
返回0;
}关联输入和输出流当输入流与输出流关联时,任何试图从输入流读取数据的操作都会首先刷新关联的输出流,默认的cout与cin关联。
//示例8.cpp
#包括
使用命名空间std
int main(int argc,char**argv){
cout hello world endl
int I;
cin一世;//cout被缓冲区刷新
//也就是说,在等待输入之前就形成了第一个输出。
返回0;
} tie()方法允许我们关联输入和输出流。
Tie有两个重载:一个接收输出流的指针(设置关联输出流的指针),另一个没有参数(返回关联输出流的指针)。
//示例9.cpp
#包括
使用命名空间std
int main(int argc,char**argv){
STD:ostream * m _ ostream=CIN . tie();
if(m_ostream==cout){
cout m _ ostream==cout endl//m_ostream==cout
}
CIN . tie(nullptr);//取消与其他输出流的关联
CIN . tie(cout);//恢复关联
返回0;
}文件输入输出三种ofstream对象支持文件的内容操作,ifstream从文件中读取数据,ofstream将数据写入给定文件,fstream可以读写给定文件。
使用文件stream object///example 10 . iofile
创建hello world流,打开和关闭文件
//示例10.cpp
#包括
#包括
#包括
使用命名空间std
int main(int argc,char**argv){
//构造一个ifstream并打开给定的文件
ifstream m_instream(。/example 10 . iofile );
//或者
//if stream m _ instream;
//m_instream.open(。/example 10 . iofile );
if(m_instream.fail()!m_instream.good()){
cout“文件打开失败”endl
返回0;
}
字符串str
m_instream字符串;
cout str . size(): str endl;//5:你好
m_instream字符串;
cout str . size(): str endl;//5:世界
m_instream字符串;
m _ instream . seekg(0);//
getline(m_instream,str);
cout str . size(): str endl;//5:世界
//关闭输入流
if(m_instream.is_open()){
m _ instream . close();
}
返回0;
}fstream自动构造和销毁对于fstream对象,无论是栈内存对象还是堆内存对象,当它们离开作用域时,都会调用fstream的析构函数,然后自动调用close。
文件模式
Trunc模式只能在out置位时设置。
如果未设置trunc,您可以设置app模式。在app模式下,即使没有显示指定的out模式,文件也总是可以在输出模式下打开。
默认情况下,即使没有指定trunc,以out模式打开的文件也会被截断。为了保持在out模式下打开的文件内容,必须同时指定app模式,以便将数据追加到末尾或同时指定In。
Ate和二进制模式可用于任何类型的文件流对象。
默认文件模式
Ifstream默认使用in模式,ofstream默认使用out模式,fstream默认使用inout模式。
//示例11.cpp
#包括
#包括
使用命名空间std
int main(int argc,char**argv){
fstream m _ stream
//当example11.iofile不存在时,会自动创建一个空文件
m_stream.open(./example11.iofile ,fstream:app fstream:in);//追加且可写
if(m_stream.fail()){
return-1;
}
string str= hello world \ n
m _流字符串;//写到文件中去
//m_stream.write(char*,sizt _ t);
m_stream.seekg(0,IOs:beg);//更改读指针的位置
//m_stream.seekp(0,IOs:end);//更改写指针的位置
//m _ stream。tellp();
//cout m _ stream。tellg()endl;
//m_stream.peek()!=EOF//返回文件流中的第一个字符,但并不是提取该字符。
cout m _ stream。eof()endl;//0
while(m_stream.good()!m_stream.eof()){//下一个字符不是文件结束
getline(m_stream,str);
标准输出字符串\ n ;
}
cout m _ stream。eof()endl;
m _ stream。close();
返回0;
}字符串流流头文件定义了三个支持内存木卫一,可以向线写入数据,从线读取数据,就像线是一个超正析象管(图片Orthicon)流一样
用法从线读取数据,ostringstream向线写入数据,而头文件字符串流既可以从线读数据写可以写数据,同理这些类也继承iostream,可以使用iostream、istream、ostream相关的操作
使用用法字符串输入流,即从流中读取数据
//示例12.cpp
#包括
#包括
使用命名空间标准
int main(int argc,char**argv){
string str= hello world
istringstream m _ istringstream(str);//拷贝一份潜艇用热中子反应堆(海底热反应堆的缩写)作为输入流使用
字符串温度;
m_istringstream温度;//从流中读取数据
cout temp endl//你好
cout m _ istringstream。eof()endl;//0
m_istringstream温度;//从流中读取数据
cout temp endl//世界
cout m _ istringstream。eof()endl;//1
返回0;
}使用奥斯特林河字符串输出流,即向字符串流写数据
//示例13.cpp
#包括
#包括
使用命名空间标准
int main(int argc,char**argv){
string str= hello world
ostringstream m _ ostringstream(str);
m _ ostringstream“c”;
字符串温度;
temp=m _ ostringstream。str();
cout temp结束//c o世界
m _ ostringstream“hello c”;
//返回流保存的线的拷贝
cout m _ ostringstream。str()endl;//c hello c
返回0;
}使用字符串流综合了用法与奥斯特林河的功能特性
//示例14.cpp
#包括
#包括
使用命名空间标准
int main(int argc,char**argv){
字符串流流;
流《hello world》;//向流写入内容
cout流。str()endl;//你好世界
字符串温度;
水流温度;//从流中读取内容
cout流。eof()endl;//0
cout temp endl//你好
水流温度;//从流中读取内容
cout temp endl//世界
cout流。eof()endl;//1
返回0;
}不要慌,在此学习的内容不是文件操作,如果从C语言来学C我们的思想要逐渐学习面向对象的思想,C向我们提供了强大的超正析象管(图片Orthicon)流的操作的封装,这使得开发更加便捷,使用得当代码也能得到较好的维护性
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。