这个有点难,最大的努力给高分

AXUBOD 2012-07-11 05:02:34
01.011 365 14996540.12
01.011 1 4160.33
01.091 1 1937.48
01.092 1 2224.2
01.111 1 8591.27
01.131 1 837.35
01.141 1 4957.11
01.241 1 31151.52
01.314 3 194994.89
01.314 3 30716.3
这个是我读取文件中的一小部分,要求的是一定要用string来写,我现在的要求是分行读取操作,先将第一行的三个数据依据空格判断方式分开成三部分存储在数组里面。然后再取出第一部分,也就是01.011对他进行判断是否含有小数点,有小数点,只保留小数点后一位,麻烦了各位,本人会尽力给最高分,先说声谢谢了
...全文
385 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2012-07-12
  • 打赏
  • 举报
回复
通过上面的代码,得到结果大致是这样的:

01.0 365 14996540.12
01.0 1 4160.33
01.0 1 1937.48
01.0 1 2224.20
01.0 368 15004862.13 // 新增的
01.1 1 8591.27
01.1 1 837.35
01.1 1 4957.11
01.1 3 14385.73 // 新增的
01.2 1 31151.52
01.3 3 194994.89
01.3 3 30716.30
01.3 6 225711.19 // 新增的
pathuang68 2012-07-12
  • 打赏
  • 举报
回复
新增加的代码,没怎么加注释了,楼主应该看得懂了吧。

建议楼主参考一下下面的代码,自己再重新写一遍。

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

string period_processing(string str) // 如果有小数点,则仅保留小数点后面1位
{
size_t pos = str.find_first_of(".");
if(pos != string::npos)
{
str = str.substr(0, pos + 2);
}

return str;
}

int main(int argc, char** argv)
{
char row[100]; // 用于获取文件中的一行
int pos1; // 每行中第一个空格的位置
int pos2; // 每行中第二个空格的位置
vector<string> column1; // 用于存放第一列数据
vector<int> column2; // 用于存放第二列数据
vector<double> column3; // 用于存放第三列数据

vector<string> column21;
vector<int> column22;
vector<double> column23;

ifstream fis("E:/testfile.txt"); // 假定文件在E盘的根目录下,文件名为testfile.txt
if(!fis)
{
cout << "Can not open file..." << endl;
exit(1);
}

while(fis)
{
memset(row, 0, 100);
fis.getline(row, 100); // 从文件中读取一行
string aline(row);
pos1 = aline.find_first_of(" ");
pos2 = aline.find_last_of(" ");

string str1 = aline.substr(0, pos1); // 获取每行的第一列内容
string str2 = aline.substr(pos1 + 1, pos2 - pos1 - 1); // 获取每行的第二列内容
string str3 = aline.substr(pos2 + 1); // 获取每行的第三列内容

column1.push_back(period_processing(str1));
column2.push_back(atoi(str2.c_str()));
column3.push_back(atof(str3.c_str()));
}
fis.close();

int sum1 = 0;
double sum2 = 0.0;
for(int i = 0; i < column1.size(); ++i)
{
if(i > 0 && column1[i] == column1[i - 1])
{
sum1 += column2[i - 1];
sum2 += column3[i - 1];
}

if(i > 0 && column1[i] != column1[i - 1])
{
sum1 += column2[i - 1];
sum2 += column3[i - 1];
if(sum1 != column2[i - 1])
{
column21.push_back(column1[i - 1]);
column22.push_back(sum1);
column23.push_back(sum2);
}
sum1 = 0;
sum2 = 0.0;
}
column21.push_back(column1[i]);
column22.push_back(column2[i]);
column23.push_back(column3[i]);
}

// 将得到的结果写到另外一个文件中
ofstream fos("E:/result.txt");
for(int i = 0; i < column21.size() - 1; ++i)
{
if(i != 0)
{
fos << endl;
}

char c3[20] = {0};
sprintf(c3, "%.2f", column23[i]);
fos << column21[i] << " " << column22[i] << " " << c3;//column23[i];
}
fos.close();

return 0;
}
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
嗯。。好的,非常感谢,辛苦了,以后你有什么困难,我也会尽力的,感谢你
pathuang68 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 的回复:]

嗯,是啊,不用保留一位,保留一位的只针对第一个
[/Quote]

哦,明白了,哥试试看吧。
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
把你都搞糊涂啦,,,太对不起了,这是最后的了,麻烦把代码写过给我看看,最高分给你,辛苦你啦。。
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
嗯,是啊,不用保留一位,保留一位的只针对第一个
pathuang68 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]

01.011 365 14996540.12
01.011 1 4160.33
01.091 1 1937.48
01.092 1 2224.2
01.111 1 8591.27
01.131 1 837.35
01.141 1 4957.11
前面21楼,我说错了,其实你的理解是对的啊,是前四行做一次总和,后三行在做一次总和,结果应该是这样
的01.011 365 149965……
[/Quote]

这样看起来就正常多了。不过最后一个字段确定不用只保留一位小数吗?
pathuang68 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]

不好意思,打快了,是01.0啊,今天真心不好意思啊,麻烦了
[/Quote]

这我就更加不清楚需求了。
01.091 1 1937.48
01.092 1 2224.2

01.0 2 4161.68\\这就是结果

凭啥上面两行要加起来呢?难道它们的第一个字段经过小数点处理后都是01.0吗?如果是这样的话,那么文件中的第一行和第二行的第一个字段也都是一样的哦。于是问题就来了,为什么第1行和第2行相加,第3行和第4行相加?难道是只要碰到第一个字段相同的两行就相加,并增加一行。增加一行后,前面的就不管了,只用这种方式处理后面的?
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
01.011 365 14996540.12
01.011 1 4160.33
01.091 1 1937.48
01.092 1 2224.2
01.111 1 8591.27
01.131 1 837.35
01.141 1 4957.11
前面21楼,我说错了,其实你的理解是对的啊,是前四行做一次总和,后三行在做一次总和,结果应该是这样
的01.011 365 14996540.12
01.011 1 4160.33
01.091 1 1937.48
01.092 1 2224.2
01.0 368 15004862.13\\结果
01.111 1 8591.27
01.131 1 837.35
01.141 1 4957.11
01.1 3 14385.73\\结果
就这样,给最高分,帮忙解决一下
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
不好意思,打快了,是01.0啊,今天真心不好意思啊,麻烦了
pathuang68 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]

01.011 365 14996540.12
01.011 1 4160.33
01.01 366 15000700.44 \\结果
01.091 1 1937.48
01.092 1 2224.2
01.0 2 4161.68\\这就是结果
01.111 1 8591.27
01.131 1 837.35
01.141 1 4957.11
……
[/Quote]

01.01 366 15000700.44 \\结果

第一个字段小数点后面怎么有2位呢?难道不是01.0么?
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
我15楼的说法说错了
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
01.011 365 14996540.12
01.011 1 4160.33
01.01 366 15000700.44 \\结果
01.091 1 1937.48
01.092 1 2224.2
01.0 2 4161.68\\这就是结果
01.111 1 8591.27
01.131 1 837.35
01.141 1 4957.11
01.1 3 9428.62\\结果
下面的就没写了,就这样
pathuang68 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

玄机逸士,帮忙搞定啊,高分
[/Quote]

我觉得我需求都不是特别清楚。

比如:

01.011 365 14996540.12
01.011 1 4160.33
01.091 1 1937.48
01.092 1 2224.2

经过你在楼顶说的处理后,第一个字段全部会变成01.0,也就是说要在第5个位置增加一行,而这个和你在15楼的说法不一致了,对吧?

所以,我猜应该是先纯粹地拆分,然后增加合并行,在然后进行小数点处理。不过这只是猜测。

由于我对你的需求不能很sure,所以估计帮不上了,有啥具体问题,我可以帮你。
代码写到这个份上,楼主自己应该可以搞定了吧:)
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
玄机逸士,帮忙搞定啊,高分
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
确定增加一行,但第一个字符就不用再加了还是01.0就加后面的两个,
还有保证后面不会再出现01.01了,谢谢
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
{

ifstream in("C:\\Users\\lenovo\\Desktop\\Test.txt",ios::in);
if (!in)
{
cout<<"error, open cross.txt"<<endl;
return -1;
}
string s;
while(getline(in,s))
int pos1 = s.find_first_of(" ");
int pos2 = s.find_last_of(" ");

string str1 =s.substr(0, pos1); // 获取每行的第一列内容
string str2 = s.substr(pos1 + 1, pos2 - pos1 - 1); // 获取每行的第二列内容
string str3 = s.substr(pos2 + 1); // 获取每行的第三列内容

int pos3=str1.find_first_of(".");
if(pos3!=string::npos)
{
str1=str1.substr(0,pos3+2);
}
int count=atoi(str2.c_str());
double amount=atof(str3,c_str());这个就是我前面的所有写好了的了麻烦就在后面添加就行了,,谢谢
pathuang68 2012-07-12
  • 打赏
  • 举报
回复

01.011 365 14996540.12
01.011 1 4160.33
//02.02 366 15000700.4 1. 确定是增加一行吗?2. 第一个字段也需要相加吗?
//01.01 366 15000700.4 3. 如果后面第一个字段还出现01.01,应该如何处理?还是肯定不会出现?
01.091 1 1937.48
01.092 1 2224.2
01.111 1 8591.27
01.131 1 837.35
01.141 1 4957.11
01.241 1 31151.52
01.314 3 194994.89
01.314 3 30716.3


觉得问题描述得还不是特别清楚,楼主把上面那些数据进行处理后所得到的结果是什么样子,写出来吧。
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
这个其实具体的题目,他只是给我个例子,叫我照着他的要求去写,我现在就把具体要求给你详细说一遍把,是这样的01.011 365 14996540.12
01.011 1 4160.33
01.091 1 1937.48
01.092 1 2224.2
01.111 1 8591.27
01.131 1 837.35
01.141 1 4957.11
01.241 1 31151.52
01.314 3 194994.89
01.314 3 30716.3这是一个文本文件,要求的是先将他读取,依据空格将他们分成三个,然后只对第一列进行判断是否有小数点有小数点的话就保留第一位小数,然后对比后面的各行,如果后面的第一列数字和第一行相等的话,就在其后另起一行对前面的数进行一次叠加对这个例子就是1,2行进行一次叠加,3,4行进行一次叠加右面的以此类推,就这样,麻烦了各位,如果还有什么不懂得就问,谢谢啦,各位,你们写的非常好啊
AXUBOD 2012-07-12
  • 打赏
  • 举报
回复
先帮忙解决一下嘛,后面的暂时保留,会给分的,放心
加载更多回复(18)

64,439

社区成员

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

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