[C++] IO总结

本文详细介绍了C++中的IO操作,包括标准IO中的输入输出方法,如cin、cout的使用,以及错误处理。接着,讨论了文件IO,包括ifstream和ofstream的构造方法和成员函数,以及二进制文件IO的操作。文章涵盖了输入输出的缓冲区管理、格式化输出以及错误处理策略,是理解C++ IO系统的重要参考资料。

C++中的IO库提供了用于输入输出的各种流,除此之外还提供了管理流和缓冲区等功能。IO库结构如下图所示:
IO

相同颜色的类位于同一个头文件中

  • ios_base:表示流的基本特征;
  • ios:继承于ios_base,提供了一个指向streambuf的指针;
  • streambuf:为缓冲区提供了内存,并提供了用于操作缓冲区的方法;
  • istream:继承于ios类,提供了输入方法;
  • ostream:继承于ios类,提供了输出方法;
  • iostream:继承于istreamostream,提供了输入输出方法;
  • ifstream:继承于istream,提供了对文件进行输入的方法;
  • ofstream:继承于ostream,提供了对文件进行输出的方法;
  • fstream:继承于iostream,提供了对文件进行输入输出的方法;
  • istringstream:继承于istream,对字符串进行操作的输入流类;
  • ostringstream:继承于ostream,对字符串进行操作的输出流类;
  • stringstream:继承于iostream,对字符串进行操作的输入输出流类;

1.标准IO

C++中为我们提供了四个标准IO对象:

  • cin:标准输入流对象,默认情况下关联到标准输入设备(键盘)。
  • cout:标准输出流对象,默认情况下关联到标准输出设备(显示器)。
  • clog:表示错误的标准输出流对象,默认情况下关联到标准输出设备(显示器)。
  • cerr: 用于日志记录的标准输出流对象,默认情况下关联到标准输出设备(显示器)。该流未被缓冲,这意味这信息将直接发送给屏幕,而不是等到缓冲区中填满数据或有新的换行符才会发送。

实际上应有8个对象,针对宽字符wchar_t,以上4个对象都有对应的处理wchar_t的对象。

cout,clog,cerr默认都会输出到显示器,但对输出重定向后,只会影响cout输出内容,clog和cerr不受影响。

Linux系统中,运算符2>可以重定向错误输出。

1.1.输入

使用cin进行读取已经用的够多了,常用的读取方法有:

  • operator >>:用于读取满足参数的类型(基本数据类型都可以),读取时将忽略空白符号;
  • int get():读取单个字符,读取到文件尾时,返回EOF;
  • istream& get (char& c):读取单个字符到c,读取到文件尾时,返回false;
  • istream& get (char* s, streamsize n):用于读取C风格字符串,它不会丢弃换行符,换行符将继续留在输入缓冲区中,因此接下来的输入操作首先将读取换行符;
  • istream& getline(char* s, streamsize n ):用于读取C风格字符串,通过换行符来确定行尾,但不保存换行符,而是将换行符用空字符来替换;

示例:

#include <iostream>
#include <cwchar>

int main()
{
   
   
        char c;
        std::cout << "please enter a character: ";
        // 读取单个字符
        std::cin.get(c);
        std::cout << "you entered char: " << c << std::endl;
        char firstname[12];
        char lastname[20];
        //清除缓冲区中的Enter
        std::cin.get();
        //读取c风格字符串
        std::cout << "please enter first name: ";
        //get(char*,int)会保留换行符,因此需要清除
        std::cin.get(firstname,12).get();
        std::cout << "please enter last name: ";
        std::cin.getline(lastname,20);
        std::cout << "your name: " << firstname << "." << lastname << std::endl;
        return 0;
}

1.1.1.输入错误时的处理

ios_base中包含一个用来描述流状态的数据成员,由3个标记位组成:

  • ios_base::eofbit:当cin操作到达文件末尾时,设置此标记位;
  • ios_base::failbit:当cin未能读取到预期字符时,设置此标记位;
  • ios_base::badbit:当存在无法诊断的失败破坏流时,设置此标记位;

以上任何一个如果被设置,那么流将对后面的输入/输出关闭,直到位被清除。

clear()方法负责重置标记位。

示例:

#include <iostream>

int main()
{
   
   
        using namespace std;
        int score;
        for (int i=0;i < 10;i++) {
   
   
                cout << "please enter your score: ";
                while(!(cin >> score)){
   
   
                        cin.clear(); //clear state bit
                        while(cin.get() != '\n') {
   
    //清空输入队列中的错误字符
                                continue;
                        }   
                        cout << "please enter a number: ";
                        continue;
                }
                cout << "your score: " << score << endl;
        }
        return 0;
}

1.2.输出

ostream类中对>>运算符做了重载,用来进行输出。除此之外,还有两个方法:

  • ostream& put (char c):向输出流中插入一个字符;
  • ostream& write (const char* s, streamsize n):将s指向的数组的前n个字符插入到流中;
#include <iostream>

int main()
{
   
   
        char ch; 
        char firstname
java中的IO操作总结(四) 前面已经把java io的主要操作讲完了 这一节我们来说说关于java io的其他内容 Serializable序列化 实例1:对象的序列化 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; @SuppressWarnings("serial") //一个类要想实现序列化则必须实现Serializable接口 class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return "Name:" + this.name + ", Age:" + this.age; } } public class Demo { public static void main(String[] args) { String path = File.separator + "home" + File.separator + "siu" + File.separator + "work" + File.separator + "demo.txt"; Person p1 = new Person("zhangsan",12); Person p2 = new Person("lisi",14); //此处创建文件写入流的引用是要给ObjectOutputStream的构造函数玩儿 FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream(path); oos = new ObjectOutputStream(fos); //这里可以写入对象,也可以写入其他类型数据 oos.writeObject(p1); oos.writeObject(p2); } catch (IOException e) { e.printStackTrace(); } finally { try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } } } 解压密码 www.jiangyea.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值