2017-04-14 70 views
0

当我试图连接两个字符串时,第二个字符串替换了第一个字符串的第一个字母。字符串串联取代了前几个字符

我使用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; 

    } 

(当然Im做其他的事情在此声明,但没有对串线经营,所以我离开它了)

原线

Alfonso Livingston,[email protected],800000092 

,返回是

,65onso Livingston,[email protected],800000092 

我看到this link,并试图创造新的字符串即(?)(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

正则表达式与您所描述的问题无关。你为什么包括它(或标签)?你不是使用正则表达式连接,你不是用正则表达式提取任何东西;在这个问题中没有任何与正则表达式相关的东西,除了你在'if'中使用它。 –

+0

[我无法复制它](http://ideone.com/6FNjsy)。你需要给我们更多的细节,最好是[最小,完整和可验证的例子](http://stackoverflow.com/help/mcve)。 –

+0

这是我第一次使用正则表达式,所以我不确定在正则表达式搜索中是否可能导致它。如果确实不是问题,我可以删除标记 – user7497136

回答

0

你实际上并没有写入字符串的开头,这就是你的终端如何显示一个'\r'字符。

在Windows上,文本文件使用'\ r'和'\ n'(ASCII码点0x0D0x0A)这两个字符来指示行结束。类Unix操作系统只使用'\ n'字符。如果您使用的是使用Unix样式行结尾构建的库,并为其提供了一个带有Windows样式行结尾的文件,那么当您使用std::getline时,最终会在字符串末尾添加一个额外的'\ r'字符。当您向终端打印'\ r'字符时,它会将光标移回到行的开头,因此在'\ r'字符后面的输出的其余部分将被写入字符串的开头。

拿这个例子:

如果我有文件foo。TXT与内容

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

我运行下面的程序:

#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'; 
} 

我看到以下打印到终端:

foos是一些文字

如果我们更关注一些,该文件包含的Windows风格的行结束符:

$ 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.. 

的通知“0D0A”对每一行的末尾。此外,“foo.out”包含此:

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

你可以看到,我添加到字符串的“富”是不是在所有的开始,但在最后一个“\ r”字符后。为了避免这个问题

一种方法是检查,如果你行的最后一个字符是“\ r”和若然弹出它关闭:

if (line.back() == '\r') { 
    line.pop_back(); 
} 

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

+0

解决!我只需要创建一个子字符串来切断行的最后一个字符。感谢所有帮助过我的人 – user7497136