linux下cout的问题,很奇怪的现象

Pory 2017-03-24 08:17:11
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <map>
#include <vector>
#include <fstream>
#include <string.h>
#define BUFMAXSIZE (1024*1024)

using namespace std;

void strToMap(std::string str, std::map<std::string, float> &featMap);
int main(void){
vector<map<string,float> > feats;
ifstream dataFileIn("lr.txt", ios::in);
int k = 1;
if (dataFileIn.fail())
{
std::cout << "error: data feat open failure\n";
}
char *buffer = (char*)malloc(BUFMAXSIZE * sizeof(char));
while (!dataFileIn.eof())
{
memset(buffer, 0, BUFMAXSIZE);
dataFileIn.getline(buffer, BUFMAXSIZE);
map<string, float> temp;
strToMap(buffer, temp);
feats.push_back(temp);
}
while (k--)
{
for (map<string, float> feat : feats)
{
for(map<string,float>::iterator iter=feat.begin(); iter != feat.end(); iter++)
{
cout<<iter->first<<"\n";
}
cout<<"\n";
}
}

free(buffer);
dataFileIn.close();
return 0;

}


void strToMap(std::string str, std::map<std::string, float> &featMap)
{
const char *sep = ",";
char *cbuff = new char[str.size() + 100];
strncpy(cbuff, str.c_str(), str.size() + 1);
char *p = nullptr;
char *token = strtok_r(cbuff, sep, &p);
while (token)
{
featMap.insert(std::pair<std::string, float>(token, 1.0));
token = strtok_r(NULL, sep, &p);
}
delete cbuff;
return;
}


其中输入文件lr.txt的内容为
T-L:195-34,T-L:196-55,T-L:197-20,T-L:198-29,C3:2675,C3:2675-C3:672
T-L:195-34,T-L:196-55,T-L:197-20,T-L:198-29,C3:2676,C3:2676-C3:672
T-L:195-34,T-L:196-55,T-L:197-20,T-L:198-29,C3:2675,C3:2675-C3:672

输出为
该结果正常。
但若将代码中 cout<<iter->first<<"\n"; 改为 cout<<iter->first<<",";
输出则为
明显少了2个分割的字符串,这是为什么呢?纠结了一下午。
当然如果lr.txt里文本如果每行最后都吧“,”带上,则不管怎么输出都能正常分割并显示子串,现在不明白是分割字符串的方式不安全还是cout不安全造成的。求大神指导
实验环境ubuntu64,c++至少支持c11,不过我的实验环境是c14
...全文
199 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧