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;
}
目录
相关文章
|
7月前
|
编译器 API 数据安全/隐私保护
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
632 3
|
7月前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
159 0
|
5月前
|
C++ 容器
C++中向量的操作vector
C++中向量的操作vector
|
6月前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
96 10
|
6月前
|
C++ iOS开发 开发者
C++一分钟之-文件输入输出(I/O)操作
【6月更文挑战第24天】C++的文件I/O涉及`ifstream`, `ofstream`和`fstream`类,用于读写操作。常见问题包括未检查文件打开状态、忘记关闭文件、写入模式覆盖文件及字符编码不匹配。避免这些问题的方法有:检查`is_open()`、显式关闭文件或使用RAII、选择适当打开模式(如追加`ios::app`)以及处理字符编码。示例代码展示了读文件和追加写入文件的实践。理解这些要点能帮助编写更健壮的代码。
73 2
|
6月前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
7月前
|
C++
在C和C++中,指针的算术操作
在C和C++中,指针的算术操作
|
6月前
|
算法 C++ 容器
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
289 0
|
7月前
|
存储 安全 算法
【C++入门到精通】 原子性操作库(atomic) C++11 [ C++入门 ]
【C++入门到精通】 原子性操作库(atomic) C++11 [ C++入门 ]
195 1
|
6月前
|
算法 Java API
在VC++中使用CxImage库读写图像实现像素操作
在VC++中使用CxImage库读写图像实现像素操作
51 0