C++从文件读入数据

乐哉悠哉 2011-03-27 07:40:44
亲们,急问个问题……
我要用C++的ifstream流对象读一个文本文档,数据格式比较复杂,一行中既有字符串,也有int型数据,比如某一行数据是
Element_num: 9
读入这一行后我想分别把字符串和数据存在一个字符串数组和一个int数据对象中,有什么好的办法没有啊?
...全文
440 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
go5588 2011-03-27
  • 打赏
  • 举报
回复
fileseek
Freedom 2011-03-27
  • 打赏
  • 举报
回复
这个我真没有什么好办法
CppCoder 2011-03-27
  • 打赏
  • 举报
回复
想了个笨办法,仅供参考

pFile = fopen("***.***", "r+t");
nRead = fread(缓存, sizeof(缓存类型), 文件大小, pFile);//把全部文件读到内存
//while(szBuf != '\0')//文件结构有规律可以用循环
{
nFirst = nLast = 0;

//Loop_info
nLast = find(szBuf, ":", nFirst);
szBuf(0, nLast)->szTemp;
szTemp[nLast] = '\0';
nFirst = nLast;

//Radial
nLast = find(szBuf, "\n", nFirst);//\r\n?
szBuf(nFirst, nLast)->szTemp;
szTemp[nIndex] = '\0';
nFirst = nLast;

//Relay_num
nLast = find(szBuf, ":", nFirst);
szBuf(nFirst, nLast)->szTemp;
szTemp[nLast - nFirst] = '\0';
nFirst = nLast;

//9
nLast = find(szBuf, "\n", nFirst);
szBuf(nFirst, nLast)->szTemp;
szTemp[nIndex] = '\0';
nRelayNum = atoi(szTemp);
nFirst = nLast;

//继续解析

}

乐哉悠哉 2011-03-27
  • 打赏
  • 举报
回复
不好意思,格式有点乱了,再贴一遍:

Loop_info: Radial

Relay_num: 9
Relay_configuration:
type CT_ratio fwd_element fwd_maxload
relay 0 K2CG_C 120.0 relay 1 40.0
relay 1 K2CG_C 120.0 switch_0, relay 4 40.0

Switch_info:
state fwd_element bwd_element
switch_0 on relay 1 relay 4
switch_1 off relay 6 relay 5

Load_info:
max_fP min_fP max_fG min_fG
load_0 NULL 650.0 NULL 290.0
load_1 NULL 649.0 NULL 291.0
乐哉悠哉 2011-03-27
  • 打赏
  • 举报
回复
那我贴数据了……有点不好意思,我原来觉得比较复杂,没人愿意看的……我在这里试图描述一个继电保护系统(这个无所谓),根据文本文档里的数据,程序能够自动判断出来继电器(即relay)之间的连接情况,并且能够把这些参数读入到对应的relay(我定义了relay类)中,数据完整格式如下,不知道有没有什么好办法?

Loop_info: Radial

Relay_num: 9
Relay_configuration:
type CT_ratio fwd_element fwd_maxload
relay 0 K2CG_C 120.0 relay 1 40.0
relay 1 K2CG_C 120.0 switch_0, relay 4 40.0

Switch_info:
state fwd_element bwd_element
switch_0 on relay 1 relay 4
switch_1 off relay 6 relay 5

Load_info:
max_fP min_fP max_fG min_fG
load_0 NULL 650.0 NULL 290.0
load_1 NULL 649.0 NULL 291.0
qq120848369 2011-03-27
  • 打赏
  • 举报
回复
贴你的数据格式吧,都是简单问题,别描述来描述去了.
delphiwcdj 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 guankle 的回复:]

我想了一下,或许可以这么实现:
先用getline()读入一行,存入到一个长的字符串数组ch[100]中,然后对每一位比较ASCII码值,如果遇到是字母字符就存到目标字符串数组中,如果是数字就存到另一个字符串数组中,然后用atoi()函数将后者转化为数字,这样应该可以吧?
[/Quote]
格式固定的话,可以
乐哉悠哉 2011-03-27
  • 打赏
  • 举报
回复
我想了一下,或许可以这么实现:
先用getline()读入一行,存入到一个长的字符串数组ch[100]中,然后对每一位比较ASCII码值,如果遇到是字母字符就存到目标字符串数组中,如果是数字就存到另一个字符串数组中,然后用atoi()函数将后者转化为数字,这样应该可以吧?
delphiwcdj 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 guankle 的回复:]

引用 2 楼 delphiwcdj 的回复:
C/C++ code

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream infile("file.txt");
string strWord;
if (!infile)
{
fprintf(stderr,"can……
[/Quote]
因为你要处理得到你的数据,或者一次读一行,每次需要数据的时候再解析,读一行用getline
qq120848369 2011-03-27
  • 打赏
  • 举报
回复
楼主直接贴你的数据是什么吧,很灵活的东西。
qq120848369 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qq120848369 的回复:]

你需要格式化输入.

fscanf("%s:%d",str,&n);
[/Quote]

试了一下,这个办法不行.

你还是getline自己写函数解析吧。
qq120848369 2011-03-27
  • 打赏
  • 举报
回复
你需要格式化输入.

fscanf("%s:%d",str,&n);
BIMOZHI 2011-03-27
  • 打赏
  • 举报
回复
最近学习编译原理 在识别标识符时用了两个指针,你可以构造一个队列或栈 判断后将两个指针间的东西整体移动,具体多行怎么判断,我也没什么好的办法
乐哉悠哉 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 delphiwcdj 的回复:]
C/C++ code

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream infile("file.txt");
string strWord;
if (!infile)
{
fprintf(stderr,"cann……
[/Quote]
可是我的数据有很多行,我不能这样一个一个读啊~
delphiwcdj 2011-03-27
  • 打赏
  • 举报
回复

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream infile("file.txt");
string strWord;
if (!infile)
{
fprintf(stderr,"cannot open exam.txt !\n");
return 1;
}
while (infile)
{
infile>>strWord;// get a word
// 再处理下
}
return 0;
}


乐哉悠哉 2011-03-27
  • 打赏
  • 举报
回复
读入之前可能不知道字符串是什么,但是位置是确定的,比如
Element_num: 9
字符串可能不是Element_num,但一定是先一个字符串,再一个int型数据~

65,186

社区成员

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

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