c++ - 使用 getline 读入字符串,但每行出现换行符
问题描述
我的文本文件看起来像这样:
Florida FL
Nevada NV
New York NY
现在,当我使用 getline 读取文件并将其打印到控制台时,每行末尾都有一个换行符(除了最后一行)。不过,Getline 应该摆脱换行符。那是从哪里来的呢?
ifstream inFileAbb("abbreviation.txt", ios::in);
while(getline(inFileAbb, line)){
cout << line;
}
解决方案
系统的方法是分析所有可能的输入数据,然后在文本中搜索模式。在您的情况下,我们分析问题并发现
- 在字符串的末尾,我们有一些连续的大写字母
- 在此之前我们有州名
- 我们不关心 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;
}
推荐阅读
- excel - 如果命令 Application.run 不应该能够打开工作簿,为什么引用的工作簿打开两次?
- r - 在 x 轴线上方有 ggplot2 geom_points
- c++ - 在 C++ 程序中未正确读取文本文件
- numpy - 矩阵乘法的结合律失败?输出看起来像随机数
- php - Symfony 5 + Docker:SQLSTATE[HY000] [2002] 连接被拒绝
- javascript - 多个 fetch 请求,使用 gatsby-node (async /await) 创建节点
- matlab - 将工作空间中的数据保存到特定路径
- django - 如何将图像保存在媒体的子目录中?
- php - 从数据库中按字母顺序对数据进行排序
- javascript - 使用 setTimeout() 在 React 中改变状态?