首页 > 解决方案 > 使用 getline 读入字符串,但每行出现换行符

问题描述

我的文本文件看起来像这样:

Florida FL
Nevada      NV
New York     NY

现在,当我使用 getline 读取文件并将其打印到控制台时,每行末尾都有一个换行符(除了最后一行)。不过,Getline 应该摆脱换行符。那是从哪里来的呢?

ifstream inFileAbb("abbreviation.txt", ios::in);
while(getline(inFileAbb, line)){   
cout << line;
}

标签: c++getline

解决方案


系统的方法是分析所有可能的输入数据,然后在文本中搜索模式。在您的情况下,我们分析问题并发现

  • 在字符串的末尾,我们有一些连续的大写字母
  • 在此之前我们有州名
  • 我们不关心 LF 的回车或新线 CR 或它们的组合

因此,如果我们搜索州缩写模式并将其拆分,则将获得州的全名。但也许有尾随和前导空格。我们将删除它,然后结果就在那里。

对于搜索,我们将使用std::regex. 模式是:1 个或多个大写字母后跟 0 个或多个空格,然后是行尾。正则表达式是:"([A-Z]+)\\s*$"

我们不关心换行符或其他什么。我们搜索我们想要的文本。

当它可用时,结果的前缀包含完整的状态名。我们将删除前导和尾随空格,仅此而已。

请参见:

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

std::istringstream textFile(R"(   Florida FL
  Nevada      NV
New York     NY)");

std::regex regexStateAbbreviation("([A-Z]+)\\s*$");

int main()
{
    // Split of some parts
    std::smatch stateAbbreviationMatch{};
    std::string line{};

    while (std::getline(textFile, line)) {
        if (std::regex_search(line, stateAbbreviationMatch, regexStateAbbreviation))
        {
            // Get the state
            std::string state(stateAbbreviationMatch.prefix());
            // Remove leading and trailing spaces
            state = std::regex_replace(state, std::regex("^ +| +$|( ) +"), "$1");

            // Get the state abbreviation
            std::string stateabbreviation(stateAbbreviationMatch[0]);

            // Print Result
            std::cout << stateabbreviation << ' ' << state << '\n';
        }
    }
    return 0;
}

推荐阅读