C++之I/0流操作(标准流、文件流、二进制操作等)

简介: C++之I/0流操作(标准流、文件流、二进制操作等)

流(stream)为C++的输入输出操作提供了许多的便利,通常我们使用的流是std::out用于输出,使用std::cin用于接收用户的输入,除此之外,C++还提供了文件流用于实现文件的读写操作,字符串流用于进行字符串的操作。


标准输入输出

头文件:#include<iostream>

返回值:是流对象,可以当bool类型使用

函数:按行读取 getline(流对象, string对象

//标准输入输出
#include <iostream>
#include <string>
using namespace std;
int main()
    string str;
    cin >> str;//按空格换行符tab键分割
    cout << str << endl;
    while (getline(cin, str))//返回值为流对象,可以当作bool类型使用
    {
        if (0 == str.compare("quit"))//或者"quit" == str
        {
            break;
        }
        cout << str << endl;
    }
    cout << "退出成功!" << endl;
    return 0;
}


文本文件输入输出

头文件:#include<fstream>

文件类型

• 文本文件:文件以文本中的ASCII码形式存储在计算机中

• 二进制文件:文件以文本中的二进制形式存储在计算机中,用户一般不能直接读懂

文件打开方式

打开方式 解释
ios::in 为读文件而打开文件
ios::out 为写文件而打开文件
ios::ate 初始位置:文件尾
ios::app 追加方式写文件
ios::trunc 如果文件存在先删除,再创建
ios::binary 二进制方式


注意:文件打开方式可以配合使用,利用|操作符

例如:用二进制写文件 ios::binary | ios::out

写文件

写文件步骤:

方法一:

  1. 头文件 #include
  2. 创建流对象 ofstream ofs;
  3. 打开文件 ofs.open(“文件路径”,打开方式);
  4. 打开文件并判断文件是否正确打开 ifs.open(“文件路径”,打开方式);
  5. 写数据 ofs<<“写入的数据”;
  6. 关闭文件 ofs.close();


方法二:创建流对象并打开文件:ofstream ofs(“文件路径”, 打开方式);

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ofstream ofs;
    ofs.open("1.txt", ios::out);//以文本写模式打开或者创建文件
    //方式二  ofstream ofs("1.txt", ios::out);创建流对象并且打开文件
    if (!ofs.is_open())//判断是否打开成功 true-成功 false-失败
    {
        cout << "创建或者打开文件失败" << endl;
    }
    ofs << "写入数据" << endl;
    ofs.close();
    return 0;
}


读文件

读文件步骤:

  1. 头文件 #include
  2. 创建流对象 ifstream ifs;
  3. 打开文件 ifs.open(“文件路径”,打开方式);
  4. 判断文件是否正确打开 ifs.open(“文件路径”,打开方式);
  5. 读数据 四种方式读取
  6. 关闭文件 ofs.close();


#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
    ifstream ifs;
    ifs.open("1.txt", ios::in);//以文本读方式打开文件
    if (!ifs.is_open())
    {
        cout << "打开文件失败" << endl;
    }
    //方法一
    string buffer;
    while (ifs >> buffer) //读的数据以空格换行符tab分隔
    {
        cout << buffer << endl;
    }
    //方法二
    while (getline(ifs, buffer))//以行的形式读取
    {
        cout << buffer << endl;
    }
    //方法三
    char c;
    while ((c = ifs.get()) != EOF)//一次读取一个字符,读到EOF停止
    {
        cout << c;
    }
    //方法四
    char b3[100] = { 0 };
    while (ifs.getline(b3, 100)) //一次读取100个字节
    {
        cout << b3 << endl;
    }
    ifs.close();//关闭文件
    return 0;
}


二进制文本输入输出

写文件

二进制写文件主要利用流对象成员函数write

函数原型:ostream& write(const char * buffer, int len);

第一个参数:字符指针buffer指向内存中的一段空间

第二个参数:读写的字节数


读文件

二进制读文件主要利用流对象成员函数read

函数原型:istream& read(char * buffer, int len);

第一个参数:字符指针buffer指向内存中的一段空间

第二个参数:读写的字节数


字符串输入输出

头文件:#include<sstream>

往流里面输出

#include <sstream>
#include <iostream>
using namespace std;
int main()
{
    ostringstream s;
    s << 10;
    cout << s.str() << endl;//无参 打印
    s.str("");//给空字符串   清空
    s << 5.9;
    cout << s.str() << endl;
    return 0;
}


从流里面读出

int main()
{
    //如果这个字符串严格按照空格(空白字符)分隔就可以获取
    istringstream stream("10 20 nihao");
    int a;
    int b;
    string str;
    stream >> a >> b >> str;
    cout << a << "\t" << b << "\t" << str << endl;
    return 0;
}


格式控制

头文件:#include

可直接查表

#include <iomanip>//格式控制头文件
int main()
{
    cout << setiosflags(ios::right) << setw(7) << 1 << endl;//设置宽度为7,右对齐
    cout << resetiosflags(ios::right);//取消对齐方式
    cout << setfill('.') << setw(30) << endl;//宽度设置为30,填充'.'输出
    cout << setfill(' ');//恢复填充为空格
    cout << setiosflags(ios::showpos) << 1 << endl;//强制在正数前加+
    cout << resetiosflags(ios::showpos);//取消强制正数前加+
    cout << setiosflags(ios::showpoint) << 1.2 << endl;//强制显示小数点后的无效0
    cout << resetiosflags(ios::showpoint);//取消强制显示小数点后的无效0
    cout << setiosflags(ios::scientific);//科学计数法
    cout << resetiosflags(ios::scientific);//取消科学记数法
    cout << setprecision(18);//精度为18,正常为16
    cout << setprecision(6);//恢复为6
    cout << oct << 15;//输出为八进制数
    cout << hex << 20;//输出为十六进制数
    return 0;
}
目录
相关文章
|
1月前
|
存储 C++ 容器
c++vector容器-赋直操作讲解
c++vector容器-赋直操作讲解
34 0
|
3月前
|
Java 编译器 C++
颠倒二进制位(C++)
颠倒二进制位(C++)
34 1
|
1月前
|
编译器 API 数据安全/隐私保护
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
100 3
|
20天前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
|
1月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
66 0
|
1月前
|
算法 网络协议 编译器
【C++ 14 新特性】C++14二进制字面量:深度探索与实践
【C++ 14 新特性】C++14二进制字面量:深度探索与实践
39 1
|
3月前
|
C++
二进制求和(C++)
二进制求和(C++)
38 1
|
26天前
|
C语言 C++
C/C++文件读取操作
C/C++文件读取操作
|
1月前
|
存储 算法 数据管理
C++中利用随机策略优化二叉树操作效率的实现方法
C++中利用随机策略优化二叉树操作效率的实现方法
77 1
|
1月前
|
存储 缓存 调度
C++关联容器深度解析:提升数据结构操作的艺术
C++关联容器深度解析:提升数据结构操作的艺术
74 0