基本 C++ 文本对齐

2024-05-10

我正在尝试编写一个程序,该程序从文件中获取输入行并使其恰好为 80 个字符(假设输入行始终小于 80),然后打印该行。这是通过在以下标点符号后添加最多两个空格来完成的:.,!;?如果一行少于 41 个字符,则不加修改地打印。

如果该行仍然不是 80 个字符,可以在整行中添加随机空格,均匀性对此并不重要。

输入文件是:Lorem Ipsum 只是印刷和排版行业的虚拟文本吗?洛雷姆 自 1500 年代以来,Ipsum 一直是业界标准的虚拟文本。 未知的印刷商拿走了一系列的字体并将其打乱以制作字体样本 书。它不仅经历了五个世纪的考验,而且还跨越了电子领域 排版,基本保持不变。它在20世纪60年代流行 随着包含 Lorem Ipsum 段落的 Letraset 表的发布,等等 最近使用 Aldus PageMaker 等桌面出版软件,包括 Lorem Ipsum 的版本。

输出文件应如下所示:

这。注意每一行是如何对齐的

这是我的代码:

const int maxLine = 80;

ifstream fin("unjustified.txt");
ofstream fout("justified.txt");

void randomSpace(string &input);
void spaceAdder(string &input);

int main() {

    string inputLine;

    while (getline(fin, inputLine)) {

        if (inputLine.size() > 40)
        {
            spaceAdder(inputLine);
        }

        else {
            fout << inputLine << endl;

        }
    }

    system("pause");
    fin.close();
    fout.close();
    return 0;
}

void spaceAdder(string &input) {



    int perPos = input.find('.');
    while (perPos != string::npos && input.size() < maxLine) {
        input.insert(perPos + 1, " ");
        perPos = input.find('.', perPos + 1);
    }


    int commaPos = input.find(',');
    while (commaPos != string::npos && input.size() < maxLine) {
        input.insert(commaPos + 1, " ");
        commaPos = input.find(',', commaPos + 1);
    }


    int questPos = input.find('?');
    while (questPos != string::npos && input.size() < maxLine) {
        input.insert(questPos + 1, " ");
        questPos = input.find('?', questPos + 1);
    }


    int semiPos = input.find(';');
    while (semiPos != string::npos && input.size() < maxLine) {
        input.insert(semiPos + 1, " ");
        semiPos = input.find(';', semiPos + 1);
    }


    int exclamPos = input.find('!');
    while (exclamPos != string::npos && input.size() < maxLine) {
        input.insert(exclamPos + 1, " ");
        exclamPos = input.find('!', exclamPos + 1);
    }


    if (input.size() < maxLine) {
        randomSpace(input);


    }
    else
        fout << input << endl;


}



void randomSpace(string &input) {

    srand(time(0));

    while (input.size() < maxLine) {


        int spacePos = input.find(" ");
        bool i = (rand() % 2 == 1) ? true : false;

        if (i = true && spacePos != string::npos)
        {
            input.insert(spacePos, " ");
            spacePos = input.find(" ", spacePos + 1);

        }

    }

    fout << input << endl;
}

但是我的代码创建的输出是:

这。请注意第 2 行和第 4 行与文本的其余部分没有对齐

我一生都无法弄清楚我的代码出了什么问题。请指出我正确的方向!谢谢


一个简单的 C++ 代码可以是:

std::ifstream input_file_stream( "file" );

unsigned counter = 0;
while( ++counter <= 80 && std::char_traits< char >::not_eof( input_file_stream.peek() ) ){
    std::cout << char ( input_file_stream.get() );
    if( counter == 80 ){
        std::cout << '\n';
        counter = 0;
    }
}

每行输出长度为80个字符:


NOTE

而不是使用std::cout您可以将其写入输出文件
这里还缺少一些单词,例如the在第 2 行末尾和第 3 行开头。
因此,另一种解决方案可以是这样的:

input:

Is Lorem Ipsum just dummy text of the printing and typesetting industry? Lorem
Ipsum has been the industry's standard dummy text ever since the 1500s, when
an unknown printer took a galley of type and scrambled it to make a type specimen
book. It has survived not only five centuries, but also the leap into electronic
typesetting, remaining essentially unchanged. It was popularised in the 1960s
with the release of Letraset sheets containing Lorem Ipsum passages, and more
recently with desktop publishing software like Aldus PageMaker including
versions of Lorem Ipsum.

C++代码:

std::ifstream input_file_stream( "file" );

unsigned max_size = 0;
for( std::string line; std::getline( input_file_stream, line );  ){
    // find the longest line
    if ( max_size < line.size() ) max_size = line.size();
}

input_file_stream.clear();
input_file_stream.seekg( 0 , std::ios_base::beg );  // rewind

for( std::string line; std::getline( input_file_stream, line );  ){

    if( line.size() == max_size ){
        std::cout << line << '\n';

    } else if (  line.size() > 70 ) {

        line.insert( line.rfind( ' ' ),std::string(  max_size - line.size() ,' ' ) );
        std::cout << line << '\n';

    } else {
        std::cout << line << '\n';
    }
}

input_file_stream.close();

output:

Is Lorem Ipsum just dummy text of the printing and typesetting industry?    Lorem
Ipsum has been the industry's standard dummy text ever since the 1500s,      when
an unknown printer took a galley of type and scrambled it to make a type specimen
book. It has survived not only five centuries, but also the leap into  electronic
typesetting, remaining essentially unchanged. It was popularised in the     1960s
with the release of Letraset sheets containing Lorem Ipsum passages, and     more
recently with desktop publishing software like Aldus PageMaker          including
versions of Lorem Ipsum.

怎么运行的

这太容易了。首先你需要找到最长的线81然后根据这条最长的线,您可以使用以下方法来调整其他线line.rfind(意味着找到最后一件事)和line.insert插入你想要的内容。每条线的长度由您决定。这里我用的是81到70之间。

每行都基于此行进行合理调整:

一位不知名的印刷商拿走了一系列的字体并将其打乱以制作字体样本

但这里的输出并不漂亮,因为所有空间都聚集在最后。为此你可以传播所有空间中的其他空间之间else if像这样的部分:

    } else if (  line.size() > 70 ) {

        unsigned need_space = max_size - line.size();
        unsigned count_space = std::count( line.begin(), line.end(), ' ' );

        std::istringstream iss( line );
        std::string temp_line;

        while( need_space-- && count_space-- ){
            std::string temp;
            iss >> temp;
            temp_line +=  temp + "__";
        }
        iss.get();  // get rid of a single space in the iss stream
        // extracts the rest of the iss stream:
        temp_line.append(  std::istreambuf_iterator<char>( iss ), std::istreambuf_iterator<char>() );
        std::cout  << temp_line << '\n';

    } else {
        std::cout << line << '\n';
    }

输出:

Is__Lorem__Ipsum__just dummy text of the printing and typesetting industry? Lorem
Ipsum__has__been__the__industry's__standard dummy text ever since the 1500s, when
an unknown printer took a galley of type and scrambled it to make a type specimen
book.__It has survived not only five centuries, but also the leap into electronic
typesetting,__remaining__essentially__unchanged.__It was popularised in the 1960s
with__the__release__of__Letraset sheets containing Lorem Ipsum passages, and more
recently__with__desktop__publishing__software__like__Aldus__PageMaker__including
versions of Lorem Ipsum.

正如你在这里看到的,我使用了__代替2-spaces显示输出上发生的情况,因此您可以将其更改为 2 个空格。 尽管代码仍然存在一些问题,例如最后一行这并不像其他人那样固定,但我不想使代码变得复杂,我认为这对于大多数情况来说就足够了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基本 C++ 文本对齐 的相关文章

随机推荐

  • AWS MobileHub:重命名 Android / iOS 示例项目

    我是 AWS Mobilehub 的新手 我喜欢它允许我使用 AWS 配置选项创建项目 但是 当我尝试构建应用程序 ios swift android 时 它总是使用我的示例项目作为项目名称 在 AWS 项目的大多数配置设置中 例如使用 c
  • Doctrine 生成实体命名空间问题?

    好吧 我对原则有最后一个问题 生成 实体命令 我运行以下命令 并得到预期的文件 src MyNamespace Bundle MyNamespaceBundle Resources config doctrine metadata orm
  • 如何消除警告:使用“$”而不是“.”对于 Eclipse 中的内部类

    我是 Android 开发新手 当我将 eclipse 和 Android SDK 更新到最新版本后 我收到警告 Use instead of for inner classes or use only lowercase letters
  • 专门针对命名空间的模板

    Given namespace A class Foo class Bar namespace B class Foo class Bar 我想在命名空间 A 或 B 上模板化一个类 以便执行以下操作 template
  • 克隆代码更改在开发站点中不可见

    我对克隆很陌生 我在 eclipse 中有一个项目文件夹 我是从cvs项目导入的 我有 zope 作为服务器 我启动 zope bin instance restart 当我在文件夹中进行更改时 我无法在开发网站中看到更改 我似乎无法发现发
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • 独占锁定ConcurrentHashMap

    我知道不可能锁定 ConcurrentHashMap 进行独占访问 但是 我找不到原因 是因为构成CHM的 Segment 没有被api公开吗 据推测 如果是的话 客户端代码可以执行 交接 锁定 Cheers 我知道不可能锁定 Concur
  • document.registerElement - 为什么我们需要指定“prototype”和“extends”?

    考虑我想扩展本地button元素 并创建我自己的super button元素 据我所知 它必须遵循以下模式 var SuperButton document registerElement super button prototype Ob
  • 在基于视图的 NSTableView 中,如何通过单击使控件成为第一响应者?

    基于视图的 NSTableView 似乎只有标准行为 为了使表内的文本字段成为第一响应者 用户必须双击或单击并 保持冷静 然而 考虑到基于视图的 NSTableViews 提供的灵活性 这种行为并不总是可取的 因为现在可能有很多不同且复杂的
  • 发送 OneSignal 推送通知时 Android 应用程序崩溃

    Android 应用程序在发送信号推送通知后立即崩溃 我收到这个错误 尝试查看其他 stackoverflow 答案 但没有帮助 请检查下面的代码 build gradle 和错误 不明白为什么它不起作用 P 请检查下面的代码 build
  • wait task.delay 有助于加快 UI 刷新速度,但是如何实现呢?

    我有一个视图模型 它正在获取一行记录并显示在 Windows Phone UI 上 这个获取数据的视图模型方法正在执行大量任务 所有任务都标记为等待操作 如下所示 async Task GetData var dataCollection
  • 如何使用 grid.arrange 移动图例位置

    我试图在一页中排列 4 个图 将图例放在底部中心 我用它来获取其中一个图的图例 因为它们对于四个图来说是相同的 get legend lt function myggplot tmp lt ggplot gtable ggplot buil
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Angular flex-layout - fxLayoutGap 导致包裹行末尾出现恼人的间隙

    使用fxLayoutGap 和wrap 在被换行的每一行的末尾留下令人讨厌的边距 有没有办法来解决这个问题 https stackblitz com edit angular fxlayoutgap calc mralnz file app
  • 在 Spring 中设置 WS https 调用超时 (HttpsUrlConnectionMessageSender)

    我正在尝试为 WS 调用设置超时 我延长了WebServiceGatewaySupport并尝试将发送者超时设置为如下 public Object marshalSendAndReceive Object requestPayload We
  • 颤动附近的连接

    当我尝试在设备上做广告或发现时 我收到此错误 但是前一天在环路上效果很好 PlatformException Failure 17 API Nearby CONNECTIONS API is not available on this de
  • 在 Django Rest Framework 中过滤多个值

    我有一个模型想要过滤多个值 我的模型 class Product models Model ean models CharField max length 13 unique True product id models CharField
  • 不支持函数调用。考虑用对导出函数的引用替换函数或 lambda

    我在我的应用程序中使用 APP INITIALIZER 并在 app module ts 中将其设置如下 并进行必要的导入 NgModule providers ContextService provide APP INITIALIZER
  • F# 对于 OO 或命令式来说缺少什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 基本 C++ 文本对齐

    我正在尝试编写一个程序 该程序从文件中获取输入行并使其恰好为 80 个字符 假设输入行始终小于 80 然后打印该行 这是通过在以下标点符号后添加最多两个空格来完成的 如果一行少于 41 个字符 则不加修改地打印 如果该行仍然不是 80 个字