读书人

文件啊文件.本人菜菜,各位

发布时间: 2012-02-13 17:20:26 作者: rapoo

文件啊文件......本人菜菜,高分求教各位
现有test.txt文件
内容如下:

北京某某律师事务所
地 址:北京市某某街8号7-6
邮 编:123456
数量:2名
姓名:杨艳涛 寇孟良

上海某某律师事务所
地址:上海市某某路22号
数量:3名
姓名:陈小玲 赵绍舜 欧邦禄

重庆某某律师事务所
地址:重庆某某商城B26楼
数量:7名
姓名:秦泽均 肖佑嘉
补永赋
郑书宏 徐齐民
赵松 黎海


=============================================================
想得到如下格式的文件

北京某某律师事务所,北京市某某街8号7-6,123456,2名,杨艳涛
北京某某律师事务所,北京市某某街8号7-6,123456,2名,寇孟良
上海某某律师事务所,上海市某某路22号,,3名,陈小玲
上海某某律师事务所,上海市某某路22号,,3名,赵绍舜
上海某某律师事务所,上海市某某路22号,,3名,欧邦禄
重庆某某律师事务所,重庆某某商城B26楼,,7名,秦泽均
重庆某某律师事务所,重庆某某商城B26楼,,7名,肖佑嘉
重庆某某律师事务所,重庆某某商城B26楼,,7名,补永赋
重庆某某律师事务所,重庆某某商城B26楼,,7名,郑书宏
重庆某某律师事务所,重庆某某商城B26楼,,7名,徐齐民
重庆某某律师事务所,重庆某某商城B26楼,,7名,赵松
重庆某某律师事务所,重庆某某商城B26楼,,7名,黎海


我在看过jixingzhong(瞌睡虫星辰) 在kid_wei发表的文章中使用的方法
经过修改,我只能得到如下的文件:

北京某某律师事务所,北京市某某街8号7-6,123456,2名,杨艳涛 寇孟良
上海某某律师事务所,上海市某某路22号,,3名,陈小玲 赵绍舜 欧邦禄
重庆某某律师事务所,重庆某某商城B26楼,,7名,,6名,秦泽均 肖佑嘉
补永赋
郑书宏 徐齐民
赵松 黎海


我的想法是把除名字之前的内容保存为一个tmp,然后直接打印tmp然后依次输出名字就可以了
但无法完成算法.....

[解决办法]
倒,你的原始文件格式是否是固定的?
人名多了是否要换行?
允许不允许某个人叫“地址:”这种名字?

[解决办法]
原始文件的格式是
单位名称
地址:XXX
邮编:XXXXXX(邮编可以有,可以无,不过已经解决了,没有邮编的我默认输出为空格)
数量:XX
姓名:XXX XXX XXX
XXX XXX
XXX
主要是姓名一行,有的是回车换行的,所以比较麻烦了- -~

允许那种名字的出现,这样简单点,而且没有谁真叫这种名字- -~(偷懒中)
[解决办法]
找到“姓名:”这个字符串。。然后逐个记录每个姓名,滤掉空格应该就可以啦把
[解决办法]
#include <fstream>
#include <string>
#include <iostream>
using namespace std;

int main()
{
ifstream ifile( "test.txt ");// input
ofstream ofile( "output.txt ");// output
string company, address, zcode, name, tmp;
int count, i;

while (!ifile.eof())
{
getline(ifile, company); //company

getline(ifile, address); //address
address = address.substr(address.find( ": ")+2); //sub-string

getline(ifile, tmp);
if (tmp.find( "邮 ") != string::npos) // zcode
{
zcode = tmp.substr( tmp.find( ": ")+2 );
getline(ifile, tmp);
}
else // count
{
zcode = " ";
}
count = tmp[tmp.find( ": ")+2]- '0 '; //get count

ifile> > name; // name
name = name.substr( name.find( ": ")+2 );

ofile < <company < < ", " < <address < < ", " < <zcode < < ", "
< <count < < "名, " < <name < <endl;

for(i=1; i <count; i++) // the following names
{
ifile> > name;
ofile < <company < < ", " < <address < < ", " < <zcode < < ", "
< <count < < "名, " < <name < <endl;


}

getline(ifile, tmp); // the white space after names
getline(ifile, tmp); // read the division line
//continue
}
return 0;
}
[解决办法]


写了个乱七八糟你参考下 - -

// C2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h "
#include "iostream "
#include "fstream "
#include "string "

using namespace std;

enum {
type_title,
type_address,
type_name,
type_number,
type_miannum,
type_error
};

long check_string(char str[], char out[], int len)
{
if (strlen(str) <= 0)
return type_error;

char* t = strstr(str, ": ");
if (!t)
t = strstr(str, ": ");

if (!t)
{
strncpy(out, str, len);
return type_title;
}

if (*t == ': ')
*t++ = 0;
else
{
*t++ = 0;
*t++ = 0;
}

strncpy(out, t, len);

if (strstr(str, "地 ") && strstr(str, "址 "))
return type_address;

if (strstr(str, "邮 ") && strstr(str, "编 "))
return type_miannum;

if (strstr(str, "数 ") && strstr(str, "量 "))
return type_number;

if (strstr(str, "姓 ") && strstr(str, "名 "))
return type_name;

return type_error;
}


int main()
{
ifstream ifile( "enter.txt ");
ofstream ofile( "out.txt ");

if (ifile.fail() || ofile.fail())
return 1;

string strsvae;
while (!ifile.eof())
{

char str[128];
char out[128];

ifile.getline(str, sizeof(str));

if (check_string(str, out, 128) != type_name)
{
strsvae += out;
strsvae += ", ";
}
else
{
string writ;
string temp;

while (1)
{
for (size_t i = 0; i < strlen(out); i++)
{
if (out[i] != ' ')
temp.push_back(out[i]);
else
{
if (!temp.empty())
{
writ = strsvae + temp;
ofile < <writ < <endl;
temp.clear();
}
}
}

if (ifile.eof())
break;

ifile.getline(str, sizeof(str));
if (check_string(str, out, 128) == type_error)
break;
}

strsvae.clear();
}

}


return 0;
}


读书人网 >C++

热点推荐