C++ read / write

getline函数

在C++中,getline 是一个标准库函数,用于从输入流中读取字符串或一行文本。它是 <string> 头文件的一部分。getline 函数会从输入流中提取字符,并将它们附加到字符串对象中,直到遇到分隔符为止。如果没有指定分隔符,getline 会读取直到下一个换行符。getline 函数通常用于读取用户输入或从文件中读取行。它可以确保即使输入中包含空格也能完整地读取整行。

举个例子🌰⬇️

void solve1(){
    freopen("infections.txt","r", stdin);
    vector<int> nums;
    string s;
    // 不断读取字符串,直到读到':'为止
    while(getline(cin, s,':')){
        int num = stoi(s);
        nums.push_back(num);
    }
    for(auto num : nums) cout << num << " ";
}

Freopen函数

在C++中,freopen 函数是用来重新打开一个已有的文件流(FILE*)与一个新的文件或者模式(mode)关联起来。这个函数定义在 <cstdio> 头文件中。当你想要改变一个已经打开的文件流的文件或者模式时,freopen 可以非常有用。例如,你可以用它来重定向标准输入输出流,如 stdin、stdout 或 stderr。

freopen 的函数原型如下:

FILE* freopen(const char* filename, const char* mode, FILE* stream);

一般的的使用就是
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);

ifstream输入文件流和ofstream输出文件流

ifstream 的基本用法如下:

  1. 创建 ifstream 对象:首先,你需要创建一个 ifstream 对象,并将其与要读取的文件关联起来。
  2. 打开文件:使用 ifstream 对象的 open 方法打开文件。如果文件成功打开,你就可以开始读取数据。
  3. 读取数据:可以使用多种方法读取文件内容,例如使用 >> 运算符或 getline 函数。getline 特别适合按行读取文本文件。
  4. 关闭文件:完成文件读取后,应该使用 close 方法关闭文件。
void solve3(){
    ifstream fin("infections.txt");  // 创建输入流对象fin
    ofstream fout("ans5.txt");     // 创建输出流对象fout
    string s;
    vector<int> nums;
    while(getline(fin, s, ':')) nums.push_back(stoi(s));
    for(auto x : nums) fout << x << " ";
    
}

// 注意传入的是地址&
void my_read(const string& path, vector<int>& nums){
    ifstream fin(path);  // 如果要设计读文件函数的话
    string s;
    while(getline(fin, s, ':')) nums.pus
    h_back(stoi(s));
}

字符串流的读取

istringstream是C++标准库中的一个类,它属于sstream(字符串流)类的一部分。istringstream对象通常用于执行C++字符串的输入操作。
以下是istringstream的一些基本用法:

  1. 从字符串中读取数据:你可以使用istringstream从字符串中读取各种类型的数据,就像从输入流中读取数据一样。例如:
#include <sstream>
#include <iostream>
using namespace std;

int main() {
    string str = "123 456";
    istringstream iss(str);
    int a, b;
    iss >> a >> b;
    cout << "a: " << a << ", b: " << b << endl;  // 输出:a: 123, b: 456
    return 0;
}
  1. 分割字符串:你可以使用istringstream来分割字符串。例如,你可以使用空格作为分隔符来分割一个包含多个单词的字符串:
#include <sstream>
#include <iostream>
using namespace std;

int main() {
    string str = "Hello World from istringstream";
    istringstream iss(str);
    string word;
    while (iss >> word) {
        cout << word << endl;
    }
    return 0;
}

这段代码将输出:

Hello
World
from
istringstream

ostringstream的用法

ostringstream是C++标准库中的一个类,它属于sstream(字符串流)类的一部分。ostringstream对象通常用于执行C++字符串的输出操作。

以下是ostringstream的一些基本用法:

  1. 将数据转换为字符串:你可以使用ostringstream将各种类型的数据转换为字符串。例如:
#include <sstream>
#include <iostream>
using namespace std;

int main() {
    int a = 123;
    double b = 456.789;
    ostringstream oss;
    oss << "a: " << a << ", b: " << b;
    string str = oss.str();
    cout << str << endl;  // 输出:a: 123, b: 456.789
    return 0;
}
  1. 创建复杂的字符串:你可以使用ostringstream来创建复杂的字符串,这比使用字符串连接(+操作符)更有效。例如:
#include <sstream>
#include <iostream>
using namespace std;

int main() {
    ostringstream oss;
    for (int i = 1; i <= 5; i++) {
        oss << "This is line " << i << ".\n";
    }
    string str = oss.str();
    cout << str;
    return 0;
}

这段代码将输出:

This is line 1.
This is line 2.
This is line 3.
This is line 4.
This is line 5.
滚动至顶部