• stl 输入输出流


    标准输入输出流

    头文件 iostream

    从标准输入读取流 cin >>

    标准输出写入流 cout <<

    get 系列函数

    get

    无参数:cin.get() 从指定的输入流中提取一个字符(包括空白字符),若读取成功,返回该字符的 ASCII 值,若遇到文件结束符或读取错误,返回特殊值 EOF

    有 1 个参数:cin.get(ch) 从输入流中读取一个字符赋给 ch

    有 3 个参数:cin.get(字符数组,字符个数n,终止字符)

            cin.get(字符指针,字符个数n,终止字符) 从输入流中读取 n-1 个字符,赋给指定的字符数组/字符指针指向的数组,若在读取 n-1 个字符之前遇到指定的终止字符,则提前结束读取 遇到终止字符时,不读取终止字符,直接在字符串缓冲区尾部加结束标志 '\0'

    getline

    cin.getline(字符数组(或字符指针),字符个数n,终止标志字符) 从输入流中读取一行字符,用法与带 3 个参数的 get 函数类似 遇到终止字符时,读取终止字符,但不会将其存储到字符串缓冲区

    流状态

    • goodbit:流未发生错误
    • eofbit:输入流遇到文件尾
    • failbit:流中发生格式错误,非致命错误,可挽回
    • badbit:发生数据丢失,致命错误,不可挽回

    获取状态信息

    int rdstate(); 无参数,返回值为状态信息特征值

    检测输入输出状态

    bool good(); 若返回 true,一切正常,没有错误发生

    bool eof(); 若返回 true,表明已到达流的末尾

    bool fail(); 若返回 true,表明 I/O 操作失败,主要原因是非法数据,但流可以继续使用

    bool bad(); 发生了致命错误,流将不能继续使用

    挽救方法

    cin.clear(); 清除错误状态

    cin.sync(); 清理错误字符

    文件输入输出流

    头文件:fstream

    一个文件流对应一个物理文件

    文件流只能按字符方式迭代

    不同操作系统文件的编码模式不同

    文件流有长度和索引两个属性

    数据类型

    数据类型

    描述

    ofstream

    表示输出文件流,用于创建文件并向文件写入信息

    ifstream

    表示输入文件流,用于从文件读取信息

    fstream

    表示文件流,同时具有 ofstream 和 ifstream 两种功能,意味着其可以创建文件,向文件写入信息,从文件读取信息

    打开文件

    从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstream 和 fstream 对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,则使用 ifstream 对象

    open

    void open(const char *filename,ios::openmode mode);

    第一个参数:指定要打开的文件的名称和位置

    第二个参数:定义文件被打开的模式

    模式标志

    描述

    ios::app

    追加模式,所有写入都追加到文件末尾

    ios::ate

    文件打开后定位到文件末尾

    ios::in

    打开文件用于读取

    ios::out

    打开文件用于写入

    ios::trunc

    如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为0

    PS:可以把以上两种或两种以上的模式结合使用,模式 A | 模式 B

    is_open

    is_open() 返回文件是否已经打开

    关闭文件

    当 C++ 程序终止时,会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件

    close

    void close();

    1. #include<iostream>
    2. #include<fstream>
    3. using namespace std;
    4. int main() {
    5. char szBuf[80];
    6. ifstream in("a.txt");//打开文本文件
    7. if (!in) {//判断读取是否成功
    8. cout << "文件不存在" << endl;
    9. return 0;
    10. }
    11. while (in.getline(szBuf, 80)) {//读取并输出文本文件中的内容
    12. cout << szBuf << endl;
    13. }
    14. in.close();//关闭文本文件
    15. return 0;
    16. }

    写入文件

    使用流插入运算符 << 向文件写入信息

    write(const char* buff,streamsize_t buffSize) 写入 nSize 字节数据到文件中

    ostream& write(const char*,int nSize) 写二进制文件

    1. #include<iostream>
    2. #include<fstream>
    3. using namespace std;
    4. typedef struct Student {
    5. char StuName[20];
    6. int StuGrade;
    7. }Student;
    8. int main() {
    9. ofstream out;
    10. out.open("student.txt");//打开文本文件
    11. Student stu1 = { "张三", 90 };
    12. Student stu2 = { "李四", 80 };
    13. out << stu1.StuName << "\t" << stu1.StuGrade << endl;//把成绩信息存到文本文件
    14. out << stu2.StuName << "\t" << stu2.StuGrade << endl;
    15. out.close();//关闭文本文件
    16. return 0;
    17. }
    1. #include<iostream>
    2. #include<fstream>
    3. using namespace std;
    4. typedef struct Student {
    5. char StuName[20];
    6. int StuGrade;
    7. }Student;
    8. int main() {
    9. ofstream out;
    10. out.open("student_2.txt");//打开文本文件
    11. Student stu1 = { "张三", 90 };
    12. Student stu2 = { "李四", 80 };
    13. out.write((const char*)&stu1, sizeof(Student));//把成绩信息存到二进制文件
    14. out.write((const char*)&stu2, sizeof(Student));
    15. out.close();//关闭文件
    16. return 0;
    17. }

    读取文件

    使用流提取运算符 >> 从文件读取信息

    read(const char* buff,streamsize_t buffSize) 读入最多 nSize 字节数据到 buff 中

    istream& read(char*,int nSize) 读二进制文件

    1. #include<iostream>
    2. #include<fstream>
    3. using namespace std;
    4. typedef struct Student {
    5. char StuName[20];
    6. int StuGrade;
    7. }Student;
    8. int main() {
    9. ifstream in;
    10. in.open("student.txt");//打开文本文件
    11. if(!in)
    12. return 0;
    13. Student stu1;
    14. Student stu2;
    15. in >> stu1.StuName >> stu1.StuGrade;//读文本文件信息
    16. in >> stu2.StuName >> stu2.StuGrade;
    17. in.close();//关闭文本文件
    18. cout << "姓名:" << stu1.StuName << ' ' << "年龄:" << stu1.StuGrade << endl;//输出读取的信息
    19. cout << "姓名:" << stu2.StuName << ' ' << "年龄:" << stu2.StuGrade << endl;
    20. return 0;
    21. }
    1. #include<iostream>
    2. #include<fstream>
    3. using namespace std;
    4. typedef struct Student {
    5. char StuName[20];
    6. int StuGrade;
    7. }Student;
    8. int main() {
    9. ifstream in;
    10. in.open("student_2.txt");//打开文本文件
    11. if (!in)
    12. return 0;
    13. Student stu1;
    14. Student stu2;
    15. in.read((char*)&stu1, sizeof(Student));//从二进制文件中读取成绩信息
    16. in.read((char*)&stu2, sizeof(Student));
    17. in.close();//关闭文件
    18. cout << "姓名:" << stu1.StuName << ' ' << "年龄:" << stu1.StuGrade << endl;//输出读取的信息
    19. cout << "姓名:" << stu2.StuName << ' ' << "年龄:" << stu2.StuGrade << endl;
    20. return 0;
    21. }

    文件位置指针

    流的位置标识

    ios::beg:流的开始位置

    ios::cur:流的当前位置

    ios::end:流的结束位置

    定位函数

    seekg

    istream& seekg(long relativepos,ios::seek_dir dir)

    针对输入流

    参数:第一个参数是要移动的字符数目,可正可负;第二个参数是移动方向,使用三种流的位置标识中的一个

    含义:字符指针相对于移动方向向前或向后移动了多少个字符

    out.seekg(n); 定位到 out 的第 n 个字节

    out.seekg(n,ios::cur); 把文件的读指针从 out 当前位置后移 n 个字节

    out.seekg(n,ios::end); 把文件的读指针从 out 末尾往回移动 n 个字节

    out.seekg(0,ios::end); 定位到 out 的末尾

    seekp

    ostream& seekp(long relativepos,ios::seek_dir dir)

    针对输出流

    参数:第一个参数是要移动的字符数目,可正可负;第二个参数是移动方向,使用三种流的位置标识中的一个

    含义:字符指针相对于移动方向向前或向后移动了多少个字符

    tellg

    针对输入流

    含义:返回该输入流的当前位置(距离文件的起始位置的偏移量)

    tellp

    针对输出流

    含义:返回该输出流的当前位置(距离文件的起始位置的偏移量)

    输入输出流中的缓冲 streambuf

    STL 提供了缓冲区类 streambuf,提供给输入输出流使用,每个标准的输入输出流对象均包含一个 streambuf 指针

    rdbuf

    可以调用 rdbuf() 获取 streambuf 指针,从而直接访问底层 streambuf 对象

    调用方法:

    • 无参数:返回调用者的流缓冲指针
    • 参数为流缓冲指针:使调用者与参数关联,返回自己当前关联的流缓冲区指针

    字符串输入输出流

    字符串输入输出流类直接对内存而不是对文件和标准输出进行操作

    头文件:

    数据类型

    数据类型

    描述

    istringstream

    字符串输入流,提供读 string 功能

    ostringstream

    字符串输出流,提供写 string 功能

    stringstream

    字符串输入输出流,提供读写 string 功能

    str

    void str() 无参数,用于将 stringstream 流中的数据以 string 字符串的形式输出

    void str(const string& s) 以字符串为参数,用以覆盖 stringstream 流中的数据

    ss.str(""); 字符串流清零,将流中的数据全部清除

    clear

    作用:清除流的错误状态,主要用在 stringstream 重复使用或者多个 stringstream 对象构造时清空,否则之前的缓冲就停留在输入输出流中

    对同一个 stringstream 对象重复赋值,需要对流使用 clear() 函数清空流的状态,此时流占用的内存没有改变,会一直增加【stringstream 不主动释放内存】,若想改变内存【一般是清除内存,减少内存消耗】,需要配合使用 str("") 清空 stringstream 的缓存

    读取 string 对象

    描述:

    • istringstream 从 string 对象中读取
    • 可以从流中提取数据,支持 >> 操作
    1. #include<iostream>
    2. #include<sstream>
    3. using namespace std;
    4. int main() {
    5. int n;
    6. float f;
    7. string strHello;
    8. string strText = "1 3.14 hello";
    9. istringstream s(strText);//string对象中读取
    10. s >> n;//从流中提取数据
    11. s >> f;
    12. s >> strHello;
    13. cout << "n=" << n << endl;
    14. cout << "f=" << f << endl;
    15. cout << "strHello=" << strHello << endl;
    16. return 0;
    17. }

    写入 string 对象

    描述:

    • ostringstream 写到 string 对象中
    • 可以把其他类型的数据写入流(往流中写入数据),支持<<操作;
    1. #include<iostream>
    2. #include<sstream>
    3. using namespace std;
    4. int main() {
    5. cout << "type an int,a float and a string:";
    6. int i;
    7. float f;
    8. string stuff;
    9. cin >> i >> f;
    10. getline(cin, stuff);
    11. ostringstream os;
    12. os << "integer=" << i << endl;//把数据写到流中
    13. os << "float=" << f << endl;
    14. os << "string=" << stuff << endl;
    15. string result = os.str();//写到string对象中
    16. cout << result << endl;
    17. return 0;
    18. }
  • 相关阅读:
    委派构造函数
    【.Net】Linq的使用
    vue3 + quasar 弹窗的几种方式
    力扣------路径总和 III
    Java多线程下——各类锁的详解
    巅峰对决:英伟达 V100、A100/800、H100/800 GPU 对比
    是否可以从一个static方法内部发出对非static方法的调用
    springboot-服务启动后访问只显示Initializing Spring DispatcherServlet ‘dispatcherServlet
    node 获取请求者的ip地址
    Python数据分析实验一:Python数据采集与存储
  • 原文地址:https://blog.csdn.net/weixin_65951505/article/details/133635612