使用getline读取字符串,但每行中都有换行符

时间:2019-07-17 18:03:45

标签: c++ getline

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

Florida FL
Nevada      NV
New York     NY

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

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

1 个答案:

答案 0 :(得分:0)

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

  • 在字符串末尾,我们有一些连续的大写字母
  • 在获得州名之前
  • 我们不在乎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;
}