繁体   English   中英

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

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

我在 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;
}

但是我想不出一种方法来阻止这些词在控制台上是 output 时被“剪切”。 例如:

图片

在第一行中,“h”和“e”被分开了,第二行和第三行的最后一个词也发生了同样的事情。

有没有办法在不固定行长的情况下确保单词保持完整?

有很多方法可以做到这一点,但这里有一个相当简单和容易的方法。

#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;
}

这隐含地假设您要删除输入字符串中可能存在的额外空格,因此如果(例如)您开始使用格式化为 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.

...但是您要求它在 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.

另一种可能性,特别是如果您想将所有output 自动换行到特定的 stream,将使用我在另一个答案中发布的自动换行 streambuf。

我接受了上面接受的答案并对其进行了修改,以便字符串流能够从原始输入文本中检测换行符。 这是代码:

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;

我是使用 stackoverflow 的新手,所以我希望格式不会太难看。

干杯!

暂无
暂无

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

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