再来发一个字符串处理有关问题
再来发一个字符串处理问题
小学期老师要做MFC作业,要弄一个彩票系统,于是我复制粘贴了一份文本文件,格式超乱,我准备只读取出期号和中奖号码,下面这是文本文档格式
下面是我的C++代码,
不出所料是乱码,我翻到以前一个帖子学着加了一个sync函数,显示正常了许多,不过还是不太对
期号之间的东西该如何消掉,原理是什么,求解答……
------解决方案--------------------
这么晚还来提问,是个好孩子,先赞一个。
你要先明确txt的格式,没有程序能处理不确定的输入格式。你可以规范数据为每一行一个记录。
不过这样的系统为什么不用数据库,这样就不用考虑这些格式问题了,而且处理速度很快。我相信这也是老师考察的一个内容。
推荐使用跨平台的轻量数据库sqlite,数据库操作网上都有现成的代码。
------解决方案--------------------
需要一个拆分函数,把文件一次读取
首先根据'\n'拆分
后面根据'\t'拆分
基本可以解决问题
------解决方案--------------------
我只冲你第一句话来的,早睡早起才是个好孩子。不管有多大的问题都要准时睡觉。能做到这一点才是好孩子。
别听那些所谓成功人士说的每天2点睡觉那些鬼话。
------解决方案--------------------
小学期老师要做MFC作业,要弄一个彩票系统,于是我复制粘贴了一份文本文件,格式超乱,我准备只读取出期号和中奖号码,下面这是文本文档格式
期号 开奖时间 开奖号码 销售金额 最新奖池 一等奖 二等奖 三等奖 详情
注数 中奖(元) 注数 中奖(元) 注数 中奖(元)
2014099 2014-08-28
01 05 10 11 13 32 14
0 0 0 0 0 0 0 0 开奖信息
2014098 2014-08-26
02 13 17 20 29 31 07
353,151,800 392,834,215 5 8,502,424 77 284,287 1534 3,000 开奖信息
2014097 2014-08-24
07 13 24 25 27 32 15
390,727,104 369,675,882 3 10,000,000 148 196,578 1599 3,000 开奖信息
下面是我的C++代码,
#include "stdafx.h"
using namespace std;
int main()
{
ifstream input("save.txt");
if (!input)
{
cout << "Open file failed" << endl;
}
string line;
string date;
vector<string> num(7);
input.sync();
getline(input, line);
getline(input, line);
while (input)
{
input >> date;
input >> line;
for (int i = 0; i < 7; ++i)
{
input >> num[i];
}
getline(input, line);
cout << date << endl;
}
}
不出所料是乱码,我翻到以前一个帖子学着加了一个sync函数,显示正常了许多,不过还是不太对
2014099
0
2014098
353,151,800
2014097
390,727,104
2014096
357,432,576
2014095
348,187,212
期号之间的东西该如何消掉,原理是什么,求解答……
------解决方案--------------------
这么晚还来提问,是个好孩子,先赞一个。
你要先明确txt的格式,没有程序能处理不确定的输入格式。你可以规范数据为每一行一个记录。
不过这样的系统为什么不用数据库,这样就不用考虑这些格式问题了,而且处理速度很快。我相信这也是老师考察的一个内容。
推荐使用跨平台的轻量数据库sqlite,数据库操作网上都有现成的代码。
------解决方案--------------------
需要一个拆分函数,把文件一次读取
首先根据'\n'拆分
后面根据'\t'拆分
基本可以解决问题
------解决方案--------------------
我只冲你第一句话来的,早睡早起才是个好孩子。不管有多大的问题都要准时睡觉。能做到这一点才是好孩子。
别听那些所谓成功人士说的每天2点睡觉那些鬼话。
------解决方案--------------------
void Trim(std::string &strTrim)
{
string::size_type fPos = strTrim.find_first_not_of(' ');
string::size_type bPos = strTrim.find_last_not_of(' ');
string::size_type nPos = strTrim.find_first_of('\n');
if( nPos != string::npos && nPos <= nPos )
bPos = nPos - 1;
if( fPos > bPos )
{
strTrim = "";
return;
}
string strTemp(strTrim.begin() + fPos, strTrim.begin()+bPos+1);
strTrim = strTemp;
}
int SplitToMultiValue(std::string strValue, std::vector<std::string> &vecValue)
{
if( strValue.empty() )
return 0;
string::size_type pos = strValue.find_first_of(' ');
if( pos == string::npos )
{
vecValue.push_back(strValue);
return vecValue.size();
}
string strFront(strValue.begin(), strValue.begin() + pos);
string strBehind(strValue.begin() + pos + 1, strValue.end());
vecValue.push_back(strFront);
Trim(strBehind);
return SplitToMultiValue(strBehind, vecValue);
}
int main(int argc, char **argv)
{
string name = "0.txt";
FILE *fp = fopen(name.c_str(), "r");
if( fp == NULL )
return 0;
char buf[1024];
while( !feof(fp) )
{
fgets(buf, 1024, fp);
if( strstr(buf, "2014") != NULL )
{
cout<<buf;
fgets(buf, 1024, fp);
string strVal(buf);
Trim(strVal);
vector<string> vecVal;