C++ 修改cin以同时返回换行符

C++ 修改cin以同时返回换行符,c++,C++,我知道getline(),但如果遇到cin时可以返回\n,那就太好了 有什么方法可以做到这一点(或类似) 编辑(示例): 最终结果应该是: hola, em dic pere newline! caram, jo també . 如果您正在阅读单独的行,则知道每读一行之后都有一个换行符。好的,除了文件中的最后一行不必用换行符分隔,读取才能成功,但是您可以通过检查eof()来检测是否有换行符:如果std::getline()成功,但设置了eof(),则最后一行不包含换行符。显然,这需要使用std

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

有什么方法可以做到这一点(或类似)

编辑(示例):

最终结果应该是:

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

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

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

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

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

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

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

std::string file((std::istreambuf_iterator<char>(in)),
                 std::istreambuf_iterator<char>());
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! "; }
}
for(std::string-line;std::getline(in,line);)
{
标准::istringstream iss(线);

对于(std::string word;iss>>word;){std::cout修改@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! "; }
}
for(std::string-line;std::getline(in,line);)
{
标准::istringstream iss(线);

对于(std::string word;iss>>word;){std::cout仅为了记录,我最终使用了这个(我想在11小时前发布)

字符串s0、s1;
while(getline(cin,s0)){
istringstream为(s0);
while(is>>s1){

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

字符串s0、s1;
while(getline(cin,s0)){
istringstream为(s0);
while(is>>s1){


当用于格式化IO时,coutIOstreams按设计跳过任何空白字符。使用未格式化IO(也称为
std::cin.get()
std::cin.read()
std::cout.put()
std::cout.write()
)如果你不想这样做。你指的是哪一个
getline
?@CharlesBailey这一个@Inuart:也许你应该澄清你的问题,因为我不明白你在问什么。
getline
只在阅读
\n
或输入结束时停止,所以如果你使用
getline
的话,空格将被占用在读取字符串中添加了DDE,并且读取将以
\n
终止,可能不是最后一行读取。好的,我仍然不明白您试图实现什么。
读取以空格分隔的字符串,因此读取字符串将永远不会只包含空格。您是在尝试读取行还是读取以空格结尾的字符串d确定每次使用的分隔符是什么?IOstreams在用于格式化IO时会根据设计跳过任何空白字符。使用未格式化IO(也称为
std::cin.get()
std::cin.read()
std::cout.put()
std::cout.write()
)如果你不想这样做。你指的是哪一个
getline
?@CharlesBailey这一个@Inuart:也许你应该澄清你的问题,因为我不明白你在问什么。
getline
只在阅读
\n
或输入结束时停止,所以如果你使用
getline
的话,空格将被占用在读取字符串中添加了DDE,并且读取将以
\n
终止,可能不是最后一行读取。好的,我仍然不明白您试图实现什么。
读取以空格分隔的字符串,因此读取字符串将永远不会只包含空格。您是在尝试读取行还是读取以空格结尾的字符串d每次确定分隔符是什么?谢谢!我一直在寻找一种更简单的方法,虽然我认为这是一个非常简单的解决方案!您想要什么更简单的解决方案,@Inuart?我对这个答案进行了一些编辑,以解决问题中的确切问题-将
\n
转换为
换行符!
。好的,对不起,这非常简单基本上解决了我的问题谢谢!我一直在寻找一个更简单的方法,虽然我认为这是一个非常简单的解决方案!你想要什么更简单的解决方案,@Inuart?我编辑了这个答案来解决问题中的确切问题-将
\n
转换为
新行!
。好的,很抱歉,这非常简单,基本上解决了我的问题如果您的输入文件没有以换行符结尾,则此操作将打印虚假的
“换行符!”
。如果您的输入文件没有以换行符结尾,则此操作将打印虚假的
“换行符!”
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! "; }
}
string s0, s1;
while(getline(cin,s0)){
    istringstream is(s0);
    while(is>>s1){
        cout<<s1<<" ";
    }
    cout<<"newline! ";
}