• C++IO类&文件输入输出


    C++IO类&文件输入输出

    作者:tongqingliu
    转载请注明出处:http://www.cnblogs.com/liutongqing/p/7072878.html


    1. istream(输入流)类型,提供输入操作。
    2. ostream(输出流)类型,提供输出操作。
    3. cin,一个istream对象,从标准输入读取数据。
    4. cout,一个ostream对象,向标准输出写入数据。
    5. cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误。
    6. >>运算符,用来从一个istream对象读取输入数据。
    7. <<运算符,用来向一个ostream对象写入输出数据。
    8. getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中。
    • IO库类型和头文件
    头文件               类型
    iostream            istream, wistream 从流读取数据
                        ostream, wostream 从流写入数据
                        iostream, wiostream 读写流
    fstream             ifstream, wifstream 从文件读写数据
                        ofstream, wofstream 向文件写入数据
                        fstream, wfstream 读写文件
    sstream             istringstream, wistringstream 从string读取数据
                        ostringstream, wostringstream 向string写入数据
                        stringstream, wstringstream 读写string
    

    我们不能对IO对象进行拷贝和赋值,所以进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const.

    • IO库条件状态

    IO操作可能会出现错误,以下可以帮助我们访问和操纵流的条件状态。

    strm::iostate        strm是一种IO类型。iostate是一种机器相关的类型,提供了表达条件状态的完整功能
    strm::badbit         用来指出流已崩溃
    strm::failbit        用来指出一个IO操作失败了
    strm::eofbit         用来指出流到达了文件结束
    strm::goodbit        用来指出流未处于错误状态。此值保证为0
    s.eof()              若流s的eofbit置位,则返回true
    s.fail()             若流的failbit或badbit置位,则返回true
    s.good()             若流s处于有效状态,则返回true
    s.clear()            将流s中所有条件状态复位,将流的状态设置为有效。返回void
    s.clear(flags)       根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate。返回void
    s.setstate(flags)    根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate。返回void
    s.rdstate()          返回流s的当前条件状态,返回值类型为strm::iostate
    
    • 查询流的状态

    将流作为条件使用,只能告诉我们流是否有效,但无法告诉我们具体发生了什么。

    IO库定义了4个iostream类型的constexpr值,表示特定的位模式。这些值用来表示特定类型的IO条件,可以与位运算符一起使用来一次性检测或设置多个标志位。

    badbit表示系统级错误,如不可恢复的读写错误。通常情况下,一旦badbit被置位,流就无法再使用了。在发生可恢复错误后,failbit被置位,如期望读取数值却读取了字符等错误。这种问题通常是可以修正的,流还可以继续使用。如果到达文件结束位置,eofbit和failbit都会被置位。goodbit的值为0,表示流还未发生错误。如果badbit、failbit和eofbit任一个被置位,则检测流状态的条件就会失败。

    标准库还定义了一组函数来查询这些标志位的状态。操作good在所有错误位均未置位的情况下返回true,而bad,fail和eof则在对应错误位被置位时返回true。此外,在badbit被置位时,fail也会返回true。这意味着,使用good或fail是确定流的总体状态的正确方法。实际上,我们将流当条件使用的代码就等价于!fail()。而eof和bad操作只能表示特定的错误。

    • fstream特有的操作
    fstream fstrm;    			创建一个未绑定的文件流
    fstream fstrm(s);   		创建一个fstream,并打开名为s的文件
    fstream fstrm(s, mode); 	同上,只不过是以mode模式打开
    fstrm.open(s); 				打开名为s的文件,并将其与fstrm绑定。返回void
    fstrm.close(); 				关闭与fstrm绑定的文件。返回void(PS:当一个fstream对象被销毁时,close会自动被调用)
    fstrm.is_open(); 			返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
    
    • 文件模式
    in 		以读的方式打开 
    out 	以写的方式打开
    app 	每次操作前均定位到文件末尾
    ate 	打开文件后立即定位到文件末尾
    trunc	截断文件
    binary 	以二进制方式进行IO
    

    以out模式打开的文件会丢弃已有数据

    示例

    demo

    #include<iostream>
    #include<fstream>
    #include<string>
    using namespace std;
    int main()
    {
    	// 写入文件
    	ofstream outfile("test.txt");
    	outfile << "hello world!";
    	outfile.close();
    	/*
    	新建one.txt:
    	one
    	one
    	one
    	*/
    	// 读取文件
    	string file("one.txt");
    	ifstream infile(file.c_str());
    	/*
    	或者
    	ifstream infile("one.txt");
    	*/
    	if (!infile)
    	{
    		cerr << "error: unable to open input file:" << file << endl;
    		return -1;
    	}
    	string s;
    	while (infile >> s)
    		cout << s << endl;
    	infile.close();
    
    	system("pause");
    	return 0;
    }
    

    程序输出结果:

    one
    one
    one
    请按任意键继续. . .
    

    还有一个test.txt

    C++primer[5]

  • 相关阅读:
    如何将DataTable转换成List<T>
    关于SqlDataAdapter的使用
    VS 2010中JS代码折叠插件
    ASP.net中的几种分页方法
    学习jquery基础教程的一些笔记
    js中innerHTML与innerText的用法与区别
    SpringBoot 中使用shiro注解使之生效
    redis分布式锁
    使用ZSetOperations(有序)操作redis
    使用SetOperations(无序)操作redis
  • 原文地址:https://www.cnblogs.com/liutongqing/p/7517663.html
Copyright © 2020-2023  润新知