字符串的连接正在替换前几个字符

时间:2017-04-14 01:51:19

标签: c++ string concatenation ifstream

当我尝试连接两个字符串时,第二个字符串正在替换第一个字符串的第一个字母。

我正在使用getline函数从文件中获取输入,行上的正则表达式选择9位数的“UIN”,并尝试将另一个字符串附加到原始的完整行。例如:

    string line; 
    ifstream in(infile);
    ofstream out("output.csv");
    getline(in, line);
    regex pat("(\\d{9})");
    smatch matches;

    if(regex_search(line, matches, pat))
    {

        line += ",65";

        cout<<line<<endl;
        out<<line<<endl;

    }

(当然我在这个陈述中做了其他事情,但没有在字符串行上操作所以我把它留了出来)

原始行是

Alfonso Livingston,mattis@dolor.co.uk,800000092

返回

,65onso Livingston,mattis@dolor.co.uk,800000092

我看到this link并尝试创建新的字符串,即。string newline(line);并进行字符串强制转换(?)(line += string(",65")),但这一切都以相同的结果结束。我也尝试使用append函数和push_back函数。任何帮助将不胜感激!

编辑:

这是我的全部功能。输入来自逗号分隔值列表input.csv。我真的不能在这个功能之外复制这个,所以我不知道我是否可以提供一个完整的可验证的例子。

void combine(string infile)
{
    ifstream in(infile);
    ofstream out("output.csv");
    int size = getSize(infile);
    int hashVal;
    string line; 
    string listVals;
    getline(in, line);
    regex pat("(\\d{9})");
    smatch matches;


    if(regex_search(line, matches, pat))
    {

        hashVal = hash(stoi(matches[0]));
        listVals = table[hashVal].getFirst()->getElem();
        line += ",65";
        cout<<line<<endl;
        out<<line<<endl;

    }


}

这不是整个已完成的功能所要做的,但这是我不得不停下来解决这个问题的地方。

1 个答案:

答案 0 :(得分:0)

您实际上并没有写到字符串的开头,而是您的终端显示'\r'字符的方式。

在Windows上,文本文件使用两个字符'\ r'和'\ n'(ASCII代码点0x0D0x0A)来表示一行的结尾。类Unix操作系统只使用'\ n'字符。如果你正在使用一个用Unix风格的行结尾构建的库并给它一个带有Windows风格行结尾的文件,当你使用{{{}时,你最终会在字符串的末尾添加一个额外的'\ r'字符。 1}}。当您向终端打印'\ r'字符时,它会将光标移回到行的开头,因此在'\ r'字符后面的其余输出将写在字符串的开头。

举个例子:

如果我的文件foo.txt包含内容

  

这是一些文字
  这是一些更多的文字

我运行以下程序:

std::getline

我看到以下内容打印到终端:

  

foos是一些文字

如果我们仔细观察一下,该文件包含Windows样式行结尾:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::string line;
    std::ifstream in("foo.txt");
    std::ofstream out("foo.out");
    std::getline(in, line);

    line += "foo";
    std::cout << line << '\n';
    out << line << '\n';
}

注意每行末尾的“0d0a”对。另外,“foo.out”包含:

$ xxd foo.txt
00000000: 7468 6973 2069 7320 736f 6d65 2074 6578  this is some tex
00000010: 740d 0a74 6869 7320 6973 2073 6f6d 6520  t..this is some
00000020: 6d6f 7265 2074 6578 740d 0a              more text..

你可以看到我添加到字符串中的“foo”根本不在开头,而是在'\ r'字符后的末尾。

避免这个问题的一种方法是检查你的行的最后一个字符是否为'\ r',然后将其弹出:

$ xxd foo.out
00000000: 7468 6973 2069 7320 736f 6d65 2074 6578  this is some tex
00000010: 740d 666f 6f0a                           t.foo.

更好的方法是转换输入文件中的行结尾以匹配您的环境。