Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用getline读入字符串,但每行中都会出现换行符_C++_Getline - Fatal编程技术网

C++ 使用getline读入字符串,但每行中都会出现换行符

C++ 使用getline读入字符串,但每行中都会出现换行符,c++,getline,C++,Getline,我的文本文件如下所示: Florida FL Nevada NV New York NY 现在,当我使用getline读入文件并将其打印到控制台时,每一行的末尾都有一个新行(除了最后一行)。但是Getline应该摆脱newline。那它从哪里来 ifstream inFileAbb("abbreviation.txt", ios::in); while(getline(inFileAbb, line)){ cout << line; } ifstream-

我的文本文件如下所示:

Florida FL
Nevada      NV
New York     NY
现在,当我使用getline读入文件并将其打印到控制台时,每一行的末尾都有一个新行(除了最后一行)。但是Getline应该摆脱newline。那它从哪里来

ifstream inFileAbb("abbreviation.txt", ios::in);
while(getline(inFileAbb, line)){   
cout << line;
}
ifstream-infibeab(“缩写.txt”,ios::in);
而(getline(inFileAbb,line)){

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

  • 在字符串的末尾,我们有一些连续的大写字母
  • 在此之前,我们有州名
  • 我们不关心LF的回车或新行CR或其组合
因此,如果我们搜索州的缩写模式并拆分,那么州的全名将可用。但可能有尾随空格和前导空格。我们将删除它,然后结果就在那里

搜索时,我们将使用
std::regex
。模式为:1个或多个大写字母,后跟0个或多个空格,后跟行尾。其正则表达式为:
“([a-Z]+)\\s*$”

我们不在乎换行或其他什么,我们只搜索我们想要的文本

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

请参阅:

#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;
}
#包括
#包括
#包括
#包括
std::istringstream文本文件(R)(佛罗里达州
内华达州
纽约),;
std::regex regexstate缩写(“([A-Z]+)\\s*$”;
int main()
{
//部分分割
std::smatch stateAbVersionMatch{};
std::字符串行{};
while(std::getline(textFile,line)){
if(std::regex_搜索(行、状态缩写匹配、regexstate缩写))
{
//得到国家
std::字符串状态(stateAbbRevisionMatch.prefix());
//删除前导空格和尾随空格
state=std::regex_replace(state,std::regex(“^+$$)()+”,“$1”);
//获取州缩写
std::string state缩写(stateAbbrevisionMatch[0]);
//打印结果

std::您确定看到了换行符吗?并非所有系统都同意换行符应该是什么。例如,如果您有一个为Windows操作系统生成的文件(换行符是回车符和换行符),并在Linux下使用该文件(换行符是换行符)您经常会遇到回车符挂起并造成麻烦。请尝试将字符串中的最后一个字符打印为整数(
cout它正在打印13。那么你是对的!在Windows上编码不会导致这个问题吗?使用根据本机操作系统约定创建的文件可以防止这个问题。如果你只是简单地将文件从具有一个操作系统的系统复制到具有不同操作系统的系统,那么你就面临着这样的风险:行尾不同。有一些工具可以转换行e在文件本身中。是的,如果你有一个Windows文本文件,一个面向Windows的C++编译器会为你做转换(如果你不希望它转换成你,用<代码>二进制< /COD>模式标志打开文件。)不过,您不需要在Windows中编写代码。应该有一个可以为您转换文件行结尾的程序,该程序可以安装在您的计算机上,也可以通过发行版的软件包管理器获得。在Windows上
notepad++
可以修复此问题
Edit->EOL Conversion->OSType
,其中OSType是Windows、MacOS或Unix。