文件内容读取到string对象

zp8451867 2008-07-13 09:04:26
输入文件格式如下:
键值1 s1 s2 ....
键值2 s1 s2 s3 ....
.........

其中键值和si 都是字符串,中间都是用\t隔开,每行间用\n隔开,每个键值后面跟的字符串个数也不一样

现在要把它们存到一个 multimap <string,string> 结构中,即输入文件中每行第一个字符串为MAP的键值,每个键值对应多个字符串。数据量很大,效率要求较高,请问如何处理?

我尝试了用以下方法处理

ifstream inFile(filename)
string s;
inFile >> s;

这样一个一个读字符串,但是无法判断什么时候读到了每行的开头,以为每行开头的字符串要当作键值插入。有没有什么方法能判断出所读字符串位于每行第一个呢?

...全文
247 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2008-07-14
  • 打赏
  • 举报
回复
楼主,优先考虑用map<string, list<string> >
taodm 2008-07-14
  • 打赏
  • 举报
回复
楼主,优先考虑用map<string, list<string> >
K行天下 2008-07-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zp8451867 的回复:]
引用 3 楼 k2eats 的回复:
你读到char数组里面 用strtok将字符串分开


读到CHAR数组里也不行,因为每行的数据是不定长的,数组空间不好分配,我认为只能先读一行到string中再想办法一个个提取字符串。
[/Quote]
哦,我看错题目意思了
初步做了一下:看合不合楼主的意思



//---------------------------------------------------------------------------

#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

int main(int argc, char* argv[])
{
fstream fin;

fin.open("1.txt", fstream::in);
multimap <string,string> ms;
multimap <string,string>::iterator it;

string str, value;
size_t pos;

if(!fin.is_open())
return -1;
while(getline(fin, str))
{
string::size_type p = str.find_first_of('\t');
string key = str.substr(0, p);
str.erase(0, p+1);

while( (pos = str.find_first_of('\t')) != string::npos)
{
value = str.substr(0, pos);

ms.insert(pair<string,string>(key, value));

str.erase(0, pos+1);

}

ms.insert(pair<string,string>(key, str));
}

for ( it=ms.begin() ; it != ms.end(); it++ )
cout << (*it).first << " => " << (*it).second << endl;
cin.get();
return 0;

}
///////////////////////////////////////////////
/* 1.txt的文件内容:
键值1 s1 s2
键值2 s1 s2 s3
键值3 s1 s2
键值4 s1 s2 s3
键值5 s1 s2
键值6 s1 s2 s3
键值7 s1
键值8 s1 s2 s3 s4
*/
////////////////////////////////////////////////


////////////////////////////////////////////////
/*运行结果:
键值1 => s1
键值1 => s2
键值2 => s1
键值2 => s2
键值2 => s3
键值3 => s1
键值3 => s2
键值4 => s1
键值4 => s2
键值4 => s3
键值5 => s1
键值5 => s2
键值6 => s1
键值6 => s2
键值6 => s3
键值7 => s1
键值8 => s1
键值8 => s2
键值8 => s3
键值8 => s4
*/
///////////////////////////////////////////////////////
//---------------------------------------------------------------------------


lily604 2008-07-13
  • 打赏
  • 举报
回复
ifstream inFile(filename)
string s;
inFile.getline(s);
hagangqiou 2008-07-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ttkk_2007 的回复:]
C/C++ code//举个例子:intmain()

{
ifstreamin("test1.txt");stringstr;if(!in)return1;while(getline(in, str)){string::size_type p=str.find('\t');stringkey=str.substr(0, p);
str.erase(0, p);string::size_type pos=str.find_first_not_of('\t');stringvalue=str.substr(pos);
cout<<key<<":"<<value<<endl;//怎么处理,就看你了}

}
[/Quote]

支持这个方法:getline(in,str);
shancao 2008-07-13
  • 打赏
  • 举报
回复
getline();就是读取一行的意思
skineffect 2008-07-13
  • 打赏
  • 举报
回复
string line;
ifstream input("myfile.txt");
getline(input,line);
用上面的代码就可将文本中的一行读入到line之中,然后定义个string find_elem="\t\n",用
string::size_type pos=0;
string::size_type pre_pos=0;
pos=line.find_first_of(find_elem,pos);
上面几行语句依次找到每个"\t"或"\n",然后可以用
string key,value;
key=line.substr(pre_pos,pos);
pre_pos=++pos;
将分割后的一个子sting压入到key中,再进行下个寻找,并将它们依次赋给value.
最后再一并赋给multimap<string,string>
我现在对multimap还不是很熟,所以先不写代码了:-)
zp8451867 2008-07-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 k2eats 的回复:]
你读到char数组里面 用strtok将字符串分开
[/Quote]

读到CHAR数组里也不行,因为每行的数据是不定长的,数组空间不好分配,我认为只能先读一行到string中再想办法一个个提取字符串。
ttkk_2007 2008-07-13
  • 打赏
  • 举报
回复

//举个例子:
int main()

{
ifstream in("test1.txt");
string str;
if(!in)
return 1;
while(getline(in, str)){
string::size_type p = str.find('\t');
string key = str.substr(0, p);
str.erase(0, p);
string::size_type pos = str.find_first_not_of('\t');
string value = str.substr(pos);
cout << key << " :" << value << endl; //怎么处理,就看你了
}

}
K行天下 2008-07-13
  • 打赏
  • 举报
回复
你读到char数组里面 用strtok将字符串分开
zp8451867 2008-07-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ttkk_2007 的回复:]
你一行一行的读,每读一行,把第一个字符串当成键,后面的当成值
[/Quote]

大哥,麻烦能不能说清楚点,我是新手。
好像用getline可以读一行到一个string里面吧???但是我不知道怎么样从string里面提取出各个字符串,能讲讲吗?
ttkk_2007 2008-07-13
  • 打赏
  • 举报
回复
你一行一行的读,每读一行,把第一个字符串当成键,后面的当成值
Visual Studio Code 是由微软开发的一款免费、开源、跨平台的现代化轻量级代码编辑器,自发布以来迅速成为全球开发者最受欢迎的工具之一。它结合了编辑器的轻便性和集成开发环境(IDE)的强大功能,支持多种编程语言和开发场景,核心特点: 1. 跨平台支持 可在 Windows、macOS 和 Linux 上运行,保持一致的用户体验。 2. 轻量级与高性能 启动速度快,占用资源少,适合处理大型项目或低配置设备。 3. 智能代码补全 内置 IntelliSense(智能感知),提供代码提示、参数信息、快速修复等功能,支持 JavaScript、TypeScript、Python、C++ 等主流语言。 4. 内置终端 直接在编辑器内打开集成终端(支持 PowerShell、CMD、Bash 等),方便执行命令行操作。 5. 调试工具 内置调试器,支持断点、变量监视、调用堆栈查看等,无需离开编辑器即可调试代码。 6. Git 集成 直接通过侧边栏管理 Git 仓库,支持提交、分支切换、冲突解决等操作。 7. 丰富的扩展生态系统 通过 Extensions Marketplace 可安装数千款插件,扩展功能包括: 语言支持:如 Java、Go、Rust 等。 主题与图标:自定义界面风格。 工具集成:如 Docker、Kubernetes、数据库连接等。 效率工具:如 REST Client、Live Server 等。 8. 自定义与主题 支持修改键盘快捷键、界面主题、文件图标等,打造个性化开发环境。 9. 多光标编辑 按住 Alt(Windows/Linux)或 Option(macOS)点击可添加多个光标,同时编辑多处代码。 10. 远程开发支持 通过 Remote - SSH、Remote - Containers 等扩展,可直接连接远程服务器或开发容器,实现无缝协作。

65,189

社区成员

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

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