C++的io处理

Kiyotaka Wang Lv3

C++的io处理

第一次C++作业前助教gg来讲了一些io相关的内容。对于一般向的考试而言,并不会像LeetCode那样为你提供好已经声明好的函数,而需要自行地处理输入输出这些问题,这也是为什么我们考试的时候往往会在输入输出上面耗费众多时间。

因此,为了防止机考的时候翻车,先记录一下第一次作业中积累的输入处理方法。

输入char

  1. 读入一个字符(包含空白符)
char c;
cin.get(c);
  1. 读入一个非空白符
char c;
cin >> c;
  1. 读取未知个数的字符(包含空白符)
char ch;
while(cin.get(ch)){
	// do something
}

get 的返回值为 istream 对象,而 istream 对象可以转换为 bool 值,因而可以出现在 while 的条件中; >> 实际上会转换成函数 operator>> 的调用,函数的返回值也为 istream 对象(https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool)

输入string

  1. 读入,以空白字符或EOF作为结束标志
cin >> s;
  1. 读入一行,以换行符(默认)或指定的字符(称为 delimiter)作为结束标志,delimiter 会被读取但不会出现在 s 中
getline(cin, s); //以换行符为结束标志
getline(cin, s, ','); //以,为结束标志

关于一行内有多种类型的输入

比如在matrix那道题中,我直接读入了形如“1 2 3 4 5 6”的字符串,我需要提取各个数字并转为int型存入数组中,因此我编写了一个split函数。此外main函数中使用了stoi将字符串转换为了int型变量。

vector<string> split(string s, char c){
    vector<string> vec;
    string temp;
    for (char i : s) {
        if (i != c){
            temp += i;
        }else{
            vec.push_back(temp);
            temp = "";
        }
    }
    vec.push_back(temp);
    return vec;
}

倒数第i个单词的长度一题中,考虑到需要排除temp有可能为空的情况,我们可以加一行判断。

#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<string> split(string s, char c){
    vector<string> ret;
    string temp = "";
    for(int i = 0; i < s.length();i++){
        if(s[i] != c){
            temp += s[i];
        }else if(s[i] == c && !temp.empty()){
            ret.push_back(temp);
            temp = "";
        }
    }
    ret.push_back(temp);
    return ret;
}
int main(){
    string input;
    getline(cin, input);
    vector<string> inputs = split(input, ' ');
    int n = 0;
    cin >> n;
    cout << inputs[inputs.size() - n].size();
    return 0;
}

总结

后续碰到新的io问题会继续更新在此博客中,总之我们要善用c++为我们提供的方便的STL,为我们的读写操作提供相应的便利。

  • 标题: C++的io处理
  • 作者: Kiyotaka Wang
  • 创建于 : 2022-10-02 22:43:02
  • 更新于 : 2022-11-21 13:03:25
  • 链接: https://hmwang2002.github.io/2022/10/02/c-de-io-chu-li/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。