简体   繁体   English

有没有办法防止 C++ output 中的单词被“删减”?

[英]Is there a way to prevent words from getting 'cut' in C++ output?

I have written this simple program in C++ to print the contents of a.txt file.我在 C++ 中编写了这个简单的程序来打印 .txt 文件的内容。

void printrules(){
    string rule_path = "myfiles/rulebook.txt";
    ifstream fin;
    fin.open(rule_path.c_str());

    if (fin.fail()){
        cout << "Sorry, there was an error in displaying the rules." <<endl;
    }

    string x;
    while (fin >> x)
        cout << x << " ";

    fin.close();
}

int main(){
    printrules;
}

But I cannot think of a way to stop the words from getting "cut" when they are output to the console.但是我想不出一种方法来阻止这些词在控制台上是 output 时被“剪切”。 For example:例如:

图片

In the first line, 'h' and 'e' got separated, and the same thing happened for the last words in the second and third lines too.在第一行中,“h”和“e”被分开了,第二行和第三行的最后一个词也发生了同样的事情。

Is there a way to make sure the words remain whole without making the length of the lines fixed?有没有办法在不固定行长的情况下确保单词保持完整?

There are quite a few ways to do this, but here's one that's fairly simple and easy.有很多方法可以做到这一点,但这里有一个相当简单和容易的方法。

#include <sstream>
#include <string>
#include <iostream>

void wrap(std::string const &input, size_t width, std::ostream &os, size_t indent = 0) {
    std::istringstream in(input);

    os << std::string(indent, ' ');
    size_t current = indent;
    std::string word;

    while (in >> word) {
        if (current + word.size() > width) {
            os << "\n" << std::string(indent, ' ');
            current = indent;
        }
        os << word << ' ';
        current += word.size() + 1;
    }
}

int main() {
    char *in = "There was a time when he would have embraced the change that was coming. In his youth he"
    " sought adventure and the unknown, but that had been years ago. He wished he could go back and learn"
    " to find the excitement that came with change but it was useless. That curiousity had long ago left"
    " him to where he had come to loathe anything that put him out of his comfort zone.";

    wrap(in, 72, std::cout, 0);
    return 0;
}

This implicitly assumes that you want to remove an extra white space that might be present in your input string, so if (for example) you started with your text formatted for 60 columns with a 5-character indent:这隐含地假设您要删除输入字符串中可能存在的额外空格,因此如果(例如)您开始使用格式化为 60 列的文本并带有 5 个字符的缩进:

     There was a time when he would have embraced the change
     that was coming. In his youth he sought adventure and
     the unknown, but that had been years ago. He wished he
     could go back and learn to find the excitement that
     came with change but it was useless. That curiousity
     had long ago left him to where he had come to loathe
     anything that put him out of his comfort zone.

...but you asked for it to be word-wrapped at 72 columns with no indentation, it would get rid of the white space being used for the previous indentation, so it would come out like this: ...但是您要求它在 72 列中自动换行,没有缩进,它会摆脱用于先前缩进的空白,所以它会像这样出现:

There was a time when he would have embraced the change that was coming.
In his youth he sought adventure and the unknown, but that had been
years ago. He wished he could go back and learn to find the excitement
that came with change but it was useless. That curiousity had long ago
left him to where he had come to loathe anything that put him out of his
comfort zone.

Another possibility, especially if you want to word-wrap all the output to a particular stream, would be to use the word-wrapping streambuf I posted in another answer .另一种可能性,特别是如果您想将所有output 自动换行到特定的 stream,将使用我在另一个答案中发布的自动换行 streambuf。

I took the accepted answer above and made it so the modified it so the stringstream would be able to detect newlines from the original input text.我接受了上面接受的答案并对其进行了修改,以便字符串流能够从原始输入文本中检测换行符。 Here's the code:这是代码:

void wrap(std::string const &input, int width, std::ostream &os, size_t indent = 0) {std::istringstream in(input);
os << std::string(indent, ' ');
size_t current = indent;
std::string line;
std::string word;
string output = "";

while(getline(in,line))
{
    std::istringstream linein(line);
    while (linein >> word) {
        if (current + word.size() > width) {
            output += "\n" + std::string(indent, ' ');
            current = indent;
        }
        output +=  word + ' ';
        current += word.size() + 1;
    }
    output += "\n" + std::string(indent, ' ');
    current = indent;
}

os << output;

I'm new to using stackoverflow, so I hope the formatting doesn't come out too ugly.我是使用 stackoverflow 的新手,所以我希望格式不会太难看。

Cheers!干杯!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM