C++ 映射内存数据在C++;

C++ 映射内存数据在C++;,c++,dictionary,c++11,C++,Dictionary,C++11,我定义了一个全局映射map sourceMap,以记录行号和源行之间的映射。 存在以下问题: 1)当我迭代地图时,如果我先打印src,然后再打印数字,则打印结果是乱码。但是,反过来是正常的。 乱码输出和代码: **codes:** for (auto item = sourceMap.begin(); item != sourceMap.end(); item++) { cout << "line: " << item-

我定义了一个全局映射
map sourceMap
,以记录行号和源行之间的映射。 存在以下问题:

1)当我迭代地图时,如果我先打印src,然后再打印数字,则打印结果是乱码。但是,反过来是正常的。

乱码输出和代码:

**codes:**
for (auto item = sourceMap.begin(); item != sourceMap.end(); item++) {
                cout << "line: " << item->first<< ", line2number:"<<sourceMap[item->first]<<endl;
            }


**outputs:**
, line2number:8dminInterface
, line2number:30payable{}
, line2number:14minInterface(){
, line2number:24t(addressdataBase)payableonlyOwner
, line2number:36dOwner(addressnewAddr)payable
, line2number:32ansfer(addressmultisig)payableonlyOwner{
line: msg.value>Limit, line2number:38
, line2number:33ransfer(msg.value);
, line2number:44ansfer(this.balance);
, line2number:41egatecall(bytes4(keccak256("AddToWangDB(address)")),msg.sender);
**代码:**
对于(auto item=sourceMap.begin();item!=sourceMap.end();item++){

猜一猜:源代码行以
\r
结尾,但没有被过滤掉。
\r
(也称为:回车符)不可见,但会将光标移动到行的开头。因此,以下输出会覆盖以前打印的内容。我曾经注意到
getline()
会删除分隔符(
\n
默认情况下)但不是
\r
。如果在Linux上处理在Windows中编写的文本(以
\r\n
行结尾),这会成为一个问题(在Linux上
\n
是常见的)。(我曾经陷入这个陷阱。);-)请编辑问题并添加一个,以便我们了解发生了什么。如果我的猜测正确,这将是一个修复(必须应用于
std::getline()
之后的读取字符串
text
):
If(text.size()&&text.back()='\r')text.pop_back()
。(coliru的在线编辑器似乎存储了
\r\n
以及我曾经发现的内容。)@Scheff非常感谢!!!它成功了!!!问题确实是由“\r”引起的。受您启发,我将“\r”替换为“”我想主要问题是我在Windows主机中使用Clion来开发代码和组织远程服务器中的数据集,因为这些代码曾经在数据集上运行良好,但突然不起作用。这可能是由于这些数据文件在Windows中被重复操作造成的。
**code:**
 for (auto item = sourceMap.begin(); item != sourceMap.end(); item++) {
      cout << "line2number:"<<sourceMap[item->first] << ",line: " << item->first <<endl;
}

**outputs:**
line2number:32,line: functiontransfer(addressmultisig)payableonlyOwner{
line2number:38,line: msg.value>Limit
line2number:33,line: multisig.transfer(msg.value);
line2number:44,line: newAddr.transfer(this.balance);
line2number:41,line: oracle.delegatecall(bytes4(keccak256("AddToWangDB(address)")),msg.sender);
line2number:27,line: oracle=dataBase;
line2number:7,line: pragmasolidity^0.4.18;
line2number:19,line: require(msg.sender==Owner);
line2number:12,line: uint256publicLimit;
line2number:39,line: {
 while (getline(blockText, lllline)){
       remove_escapesALL(lllline);
       cout<<"number: "<<sourceMap[lllline]<<", new_line: "<<lllline<<endl;
}