高分悬赏简单

zztxfxp 2010-10-05 11:22:51
如图所示,要第一张图片的txt中的三堆数据(每堆有若干行,这里省略了很多)抽出来,转化成列(三列)的形式,如图2所示。请高手指教,谢谢,最好能写个完整的程序哈。加点注释更好哈。




http://b45.photo.store.qq.com/http_imgload.cgi?/rurl4_b=283cf6f4f0be3a549f8743535be5225265a227251e59adbf5199e0e3cd9c947ef93a4fcf23fa5a58e2d9b54abcab926d352eb77c0fe6f0e817a512fd4501285bbdc4e63d2144f980c735c297763c83e5430f56b9&a=50&b=45





















































































































...全文
185 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lly212 2010-10-09
  • 打赏
  • 举报
回复
我很生气为什么每一次来都是图片xx
zztxfxp 2010-10-08
  • 打赏
  • 举报
回复
也就是把第一图片中的数据提出来,改变一下排列方式(第一图中是横向排列,每10个换行,第二张图中的数据是垂直排列了。)
zztxfxp 2010-10-08
  • 打赏
  • 举报
回复
怎么没人回答呢。
zztxfxp 2010-10-08
  • 打赏
  • 举报
回复
原始数据格式图片
编程要实现的数据格式图片
harderman 2010-10-05
  • 打赏
  • 举报
回复
看不到图,同时也不是很明白,因为我太菜
tangxianghenggood 2010-10-05
  • 打赏
  • 举报
回复
用三层循环估计可搞定
你的图看不清,这里给个二维的看下,希望有所帮助:

#include<iostream>
using namespace std;

int main()
{
for (int k=0; k<11; k++) //循环次数
{
//从键盘输入二维数组元素
int i, j;
int a[3][4];
cout<<"请从键盘输入12个二维数组元素:"<<endl;
for (i=0; i<3; i++)
{
for (j=0; j<4; j++)
{
cout<<"这是第"<<i+1<<"列,第"<<j+1<<"个元素:";
cin>>a[i][j];
}
}

//输出数组元素并求数组元素的最大值和最小值
int maxpos,row1,col1; //row1为行的下标序号,col1为列的下标序号
int minpos,row2,col2;
maxpos=a[0][0]; row1=0; col1=0;//设最大值的初始值为a的第一个元素
minpos=a[0][0]; row2=0; col2=0;
cout<<"输出二维数组元素为:"<<endl;
for (i=0; i<3; i++)
{
for (j=0; j<4; j++)
{
cout<<a[i][j]<<"\t";
if (maxpos<a[i][j])
{
maxpos=a[i][j];//保存最大元素的值
row1=i; col1=j;//保存下标序号
}
if (minpos>a[i][j])
{
minpos=a[i][j];
row2=i; col2=j;
}
}
cout<<endl;//输出格式需要 换行
}
cout<<"最大值是第"<<row1+1<<"行,第"<<col1+1<<"列的 "<<maxpos<<endl;
cout<<"最小值是第"<<row2+1<<"行,第"<<col2+1<<"列的 "<<minpos<<endl;

//把 3*4矩阵转换为4*3矩阵
cout<<"下面实现数组矩阵转换......"<<endl;
int b[4][3];//用来保存a数组元素
for (i=0; i<3; i++)
{
for (j=0; j<4; j++)
{
b[j][i]=a[i][j];
}
}
//输出转换后的二维数组元素
cout<<"转换后的数组元素如下:"<<endl;
for (j=0; j<4; j++)
{
for (i=0; i<3; i++)
{
cout<<b[j][i]<<"\t";
}
cout<<endl;
}
}

system("pause");
return 0;
}
Defonds 2010-10-05
  • 打赏
  • 举报
回复
看不到图。
zztxfxp 2010-10-05
  • 打赏
  • 举报
回复
意思很清楚了哈。第二张图片在下面哈。
zztxfxp 2010-10-05
  • 打赏
  • 举报
回复
赵文波 2010-10-05
  • 打赏
  • 举报
回复
图都看不到
cmlr_ 2010-10-05
  • 打赏
  • 举报
回复
不是很清楚lz的意思
swdrt 2010-10-05
  • 打赏
  • 举报
回复
完全看不到图的!!
dooX8086 2010-10-05
  • 打赏
  • 举报
回复
楼主的第一张图(查看html源码找到 - -!!!)
http://b57.photo.store.qq.com/http_imgload.cgi?/rurl4_b=283cf6f4f0be3a549f8743535be52252706597a1cf228a264813a0aca79a744c3abb251abcf4ea53dba249ea0a80fb6b3f171caa67eaa902eecc22249363bd72e5d149775002a81fc132d874ef28ec558a88a280&a=45&b=57


由于数据有点量〜所以采用边读边写方式,但性能....
可改用缓存分段处理,原理一样

下面的程序是先根据 TITL XXX 查找所数据段的开头位置与结尾
再用 seekg 跳到指定位读取。
输出时采用空白占位字符,再用 seekp 定位插入




#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>

using namespace std;

//格式输出参数
const int COLCOUNT = 3; //列数
const int COLWITDH = 20; //列宽(字符)
const int LINESIZE = COLCOUNT * COLWITDH;

//////////////
// 记录数据在文件中的位置段
/////////////
struct DataReg
{
long begin; //数据在文件的开始位置
long end; //数据在文件中的结束位置
};

//
// 根把 titlName 从源文件中取得数据位置段
//
DataReg getDataReg(ifstream & ifs, string titlName);

//
// 格式化输出指定的数据,并自动排列
// ofstream & ofs : 输出目标文件
// ifstream & ifs : 源数据文件
// DataReg dr : 数据在源数据文件中的位置段
void formatOuput(ofstream & ofs, ifstream & ifs, DataReg dr);




int main (int argc, char * const argv[])
{

ifstream ifsFile("data.txt"); //原数据文件
ofstream ofsFile("format.txt"); //输出数据

ofsFile<<setiosflags(ios_base::left);
ofsFile << setw(COLWITDH)<< " CD" << setw(COLWITDH)<< " DP" << setw(COLWITDH)<< " GO" << endl;

DataReg drCD = getDataReg(ifsFile, "CD"); //定位 CD 数据段
formatOuput(ofsFile, ifsFile, drCD); //读取并输出到第一列

DataReg drDP = getDataReg(ifsFile, "DP"); //DP 数据
formatOuput(ofsFile, ifsFile, drDP); //读取并输出到下一列

DataReg drGO = getDataReg(ifsFile, "Go"); //Go 数据
formatOuput(ofsFile, ifsFile, drGO);


ifsFile.close();
ofsFile.close();
return 0;
}




DataReg getDataReg(ifstream & ifs, string titlName)
{
DataReg dr;
string tmp;

titlName = "TITL " + titlName; //根据源文件数据格式,使用 TITL XXX 来查找。

ifs.seekg(0, ios_base::beg);

while (!ifs.eof())
{
//读取一行,并查找 TITL XXX
getline(ifs, tmp, '\n');
if(tmp.find(titlName, 0) == 0) break;
}
//数据在 TITL XXX 下面第6行,所以这里空跳5行。(有没有跳行函数??)
for (int i=0; i<5; ++i) getline(ifs, tmp, '\n');

dr.begin = ifs.tellg(); //数据段开头

//-----
// 查找数据结尾,(我的测试文件的数据是一行过以空格开分,所以只查找一个 \n )
// (程序中没有用到这个数据,是可有可无的,但为了完整性所以写上)
char ch;
while (ifs.get(ch) && ch!='\n') continue;

dr.end = ifs.tellg();
dr.end--;

return dr;
}

//////////
// 输出
// 采用先输出占位空白字符,再用 seekp 来定位填数据
//////////
void formatOuput(ofstream & ofs, ifstream & ifs, DataReg dr)
{
static long sMaxRow = 0; //记录输出的最大行数
static int sCol=0; //自动分配排列
sCol++;

float data;
ifs.seekg(dr.begin);
ofs.seekp(LINESIZE + sCol * COLWITDH);

long step = LINESIZE - COLWITDH + 1;

long row = 0;

while (ifs >> data)
{
row++;

if (1 == sCol)
{
ofs << setw(LINESIZE) << data << endl;
}
else
{
if (row < sMaxRow)
{
ofs << setw(COLWITDH) << data;
ofs.seekp(step, ios_base::cur);
}
else
{
ofs << setw(COLWITDH) << data << setw((COLCOUNT - sCol) * COLWITDH) << "" << endl << setw((sCol-1) * COLWITDH) << "";
}

}
}

sMaxRow = sMaxRow > row ? sMaxRow : row;

ifs.clear();
}
千杯不醉-sen 2010-10-05
  • 打赏
  • 举报
回复
没办法、、、
xiaozi0001 2010-10-05
  • 打赏
  • 举报
回复
看不了图
★南部之星★ 2010-10-05
  • 打赏
  • 举报
回复
完全看不到图,另外这种抽取数据的工作,用perl可以快速完成。

64,683

社区成员

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

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