100分求C++读取文本文件的代码,不够可以加

PageLee 2005-03-20 09:19:37
需求是这样的。有一个文本文件:
s 79.89986
358.111 10.039
358.052 10.122
357.992 10.205
357.933 10.288
357.872 10.372
...... ......
217.372 10.243
217.310 10.159
217.249 10.075
217.188 9.992
e 79.90685
s 80.30088
109.007 10.031
108.868 10.089
108.729 10.148
108.590 10.207
....... ......
24.388 10.084
24.252 10.026
24.117 9.967
e 80.30581
............

s为一个数据块的开始标志,s后面为开始的时间单位为天,浮点型,保留小数点后5位
后面为方位角和仰角,浮点型,保留小数点后3位,有N组。
e为数据块的结束标志,e后为结束的时间单位为天,浮点型,保留小数点后5位

有N个这样的数据块,怎么读入,求C++代码。
...全文
1217 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
GeminiXXXCC 2005-03-22
  • 打赏
  • 举报
回复
动态数组中放另外一个动态数组的指针就行。
PageLee 2005-03-21
  • 打赏
  • 举报
回复
现在遇到一个新的问题,我用GeminiXXXCC(吕布)的方法,我用的是CArray 在m_Data数组调用Add(tempdata)时,
编译出现如下错误:
: 'operator =' function is unavailable
不知什么原因?
动态数组里可以嵌套动态数组吗?
yuanyou 2005-03-21
  • 打赏
  • 举报
回复
ding
  • 打赏
  • 举报
回复
你是学测量的吧,这种问题很简单。
  • 打赏
  • 举报
回复
float f1,f2;
switch(str[0])
{
case 's':
f1 = atof(str+1);
....
break;
case 'e':
f1 = atof(str+1);
....
break;
default:
sscanf(str,"%f %f",&f1,&f2);
....
break;
}
fire_z 2005-03-21
  • 打赏
  • 举报
回复
不知道把数据改成下面这样的存储形式好不好用:

CArray< Data,Data&> m_data;
Data的结构为:
struct Data
{
float m_StartTime;//开始时间
float m_EndTime;//结束时间
int DataIndex; //日期索引
};
Site的结构为:
struct Site
{
float x;//方位角
float y;//仰角
int DataIndex;//日期索引
int SiteIndex;//此条Site在同一日期索引下的位置
}
CArray< Site, Site& >m_Site;//储存该数据块的仰角和方位角

使用的时候只要根据日期索引就可以挑出所有此日期的Site进行操作
fire_z 2005-03-21
  • 打赏
  • 举报
回复
楼主编译无法通过的语句应该是AFXTEMPL.h中的这一句:
m_pData[nIndex] = newElement;
我认为应该是使用了动态数组的原因使得变量所占空间无法确定而无法赋值。
所以建议楼主放弃两层嵌套的结构。
GeminiXXXCC 2005-03-21
  • 打赏
  • 举报
回复
const int MAX = 100 ; //一行最长多少代码。
char readIn[MAX] ; //存储一行文本。
char *charIn ; //存储一组数字,通过atof(charIn)转换成float
Data *tempData ; //存储一个数据块,准备放入数据块链表。
float tempFloat; //存放一个charIn[]转换过来的数字。表示日期或者角度。
Site *tempSite ; //存放一组角度。

std::list<Data*> saveData ; //存放Data的链表(没用过CArray,只能用STL的链表来表示一下)
........
for(; fgets(readIn, MAX-1, fp) != NULL;) //读取一行文本,直到文件结束
{
if(readIn[0] == 's') //如果一行的第一个字符是s
{
tempData = new Data ; //读到s,new一个数据块
//charIn现在指向s后面的日期第一个数字。假设s和数字之后只有一个空格,
//如果是其他情况,只要用一个循环判断readIn中出现数字的位置即可。
charIn = readIn+2 ;
tempFloat = atof(charIn) ;//把数字字符串转换成float
tempData->m_StartTime = tempFloat ;//把s后面的数字放入StartTime
}
else if(readIn[0] =='e') //如果一行的第一个字符是'e'
{
charIn = readIn+2 ;
tempFloat = atof(charIn) ;//把数字字符串转换成float
tempData->m_EndTime = tempFloat ; //把e后面的数字放入EndTime ;

saveData.push_back(tempData) ; //读到e就把临时Data的指针放入链表。
}
else //读到数字,即角度的处理方法
{
tempSite = new Site ; //new一个Site,用来存放该行的角度值。
charIn = readIn ;
tempFloat = atof(charIn) ;//首先存放第一个数字,方位角。
tempSite.X = tempFloat ; //取的方位角

//读取角度行空白字符的位置,用来取的第二个数字。
for(int i=0; isdigit(readIn[i]) || readIn[i] =='.' ;i++) ;

charIn = readIn+i ; //此时CharIn指向第二个数字的第一个字母。
tempFloat = atof(charIn) ;
tempSite.Y = tempFloat ;//取的仰角
tempData->m_Site.push_bak(temp.Site) ; //把这个角度存放到临时Data的Site链表中。
}
}
PageLee 2005-03-20
  • 打赏
  • 举报
回复
to xteaj(半桶水) 如果用读入一行字符的方法,怎么样将里面的浮点数解析出来?

其实我是要将这些数据块读到一个动态数组里
CArray< Data,Data&> m_data;
Data的结构为:
struct Data
{
float m_StartTime;//开始时间
float m_EndTime;//结束时间
CArray< Site, Site& >m_Site;//储存该数据块的仰角和方位角

};
Site的结构为:
struct Site
{
float x;//方位角
float y;//仰角

}
Mr-Chen 2005-03-20
  • 打赏
  • 举报
回复
使用read( )和write( )

#include <fstream.h>
#include <string.h>

void main()
{
fstream File("test_file.txt",ios::out | ios::in | ios::binary);
File.write(arr,5); // 将前5个字符——"Hello"写入文件
File.seekg(ios::beg); // 定位至文件首部
static char read_array[100000],readOne[1]; // 在此我将打算读出些数据
int i = 0;
do
{
File.read(readOne,1); // 读出1个字符
if(readOne[0]=='s')
{
...
}
i++;
}
File.close();
}

llmsn 2005-03-20
  • 打赏
  • 举报
回复
mark!
Mr-Chen 2005-03-20
  • 打赏
  • 举报
回复
使用get( )和put( )

#include <fstream.h>
void main()
{
fstream File("test_file.txt",ios::out | ios::in | ios::binary);
char ch;
ch='o';
File.put(ch); // 将ch的内容写入文件
File.seekg(ios::beg); // 定位至文件首部
File.get(ch); // 读出一个字符
cout << ch << endl; // 将其显示在屏幕上
File.close();
}

  • 打赏
  • 举报
回复
先用字符串方式读入一行字符,然后再解析第一个字符,再作处理。
char str[80];
fin.getline(str);
switch(str[0)])
{
case 's':
....
break;
case 'e':
...
break;
default:
....
break;
}
....
zengwujun 2005-03-20
  • 打赏
  • 举报
回复
mark

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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