当我尝试连接两个字符串时,第二个字符串正在替换第一个字符串的第一个字母。
我正在使用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;
}
}
这不是整个已完成的功能所要做的,但这是我不得不停下来解决这个问题的地方。
答案 0 :(得分:0)
您实际上并没有写到字符串的开头,而是您的终端显示'\r'
字符的方式。
在Windows上,文本文件使用两个字符'\ r'和'\ n'(ASCII代码点0x0D
和0x0A
)来表示一行的结尾。类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.
更好的方法是转换输入文件中的行结尾以匹配您的环境。