修改cin以返回换行符

Modify cin to also return the newlines

本文关键字:换行符 返回 cin 修改      更新时间:2023-10-16

我知道getline(),但如果遇到cin时可以返回n,那就太好了。

有什么方法可以实现这一点(或类似的)吗?

编辑(示例):

string s;
while(cin>>s){
    if(s == "n")
        cout<<"newline! ";
    else
        cout<<s<<" ";
}

输入文件txt:

hola,          em dic pere
caram, jo    també    .

最终结果应该是:

hola, em dic pere newline! caram, jo també .

如果您正在读取单独的行,则您知道每个读取行之后都有一个换行符。好吧,除了文件中的最后一行,它不必用换行符分隔即可成功读取,但您可以通过检查eof()来检测是否有换行符:如果std::getline()成功,但设置了eof(),则最后一行不包含换行符。显然,这需要使用std::getline():的std::string版本

for (std::string line; std::getline(in, line); )
{
    std::cout << line << (in.eof()? "": "n");
}

这应该在读取流时将其写入std::cout

这个问题要求输出数据,但换行符被转换为"换行符!"。您可以通过以下方式实现:

for (std::string line; std::getline(in, line); )
{
    std::cout << line << (in.eof()? "": "newline! ");
}

如果您不关心流被拆分成行,但实际上只想获得整个文件(包括所有换行符),那么您可以将流读取到std::string:

std::string file((std::istreambuf_iterator<char>(in)),
                 std::istreambuf_iterator<char>());

然而,请注意,这种确切的方法可能相当慢(尽管我知道它可以变得很快)。如果您知道文件不包含某个字符,也可以使用std::getline()将整个文件读取到std::string:中

std::getline(in, file, 0);

上面的代码假设您的文件不包含任何空字符。

修改@Dietmar的答案就可以了:

for (std::string line; std::getline(in, line); )
{
    std::istringstream iss(line);
    for (std::string word; iss >> word; ) { std::cout << word << " "; }
    if (in.eof()) { std::cout << "newline! "; }
}

为了记录在案,我最终使用了这个(我想在11小时前发布它)

string s0, s1;
while(getline(cin,s0)){
    istringstream is(s0);
    while(is>>s1){
        cout<<s1<<" ";
    }
    cout<<"newline! ";
}