我为与我的工作有关的测试目的编写了一个程序:
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <string>
#include <conio.h>
using namespace std;
/* Function to convert an std::string to int*/
int UsingATOI(std::string &str)
{
std::string strIntString(str);
int iConvertToMe;
iConvertToMe = atoi( strIntString.c_str());
return iConvertToMe;
}
/*function to splt an std::string using a delimiter ,
here a vector is exclusively passed an an argument*/
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems)
{
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim))
{
elems.push_back(item);
}
return elems;
}
/*function to splt an std::string using a delimiter ,
here a vector is prepared inside the function and returned*/
std::vector<std::string> split(const std::string &s, char delim)
{
std::vector<std::string> elems;
return split(s, delim, elems);
}
int showrecord(vector<std::string> all_lines,int linenumber)
{
char *a[]={"O_BILLABLE_ACCOUNT","O_CUSTOMER_TYPE_INDICATOR","O_A_PARTY_MSISDN_ID","O_A_PARTY_EQUIPMENT_NUMBER","O_A_PARTY_IMSI","O_A_PARTY_LOCATION_INFO_CELL_ID","O_B_PARTY_MSISDN_ID","O_B_PARTY_EQUIPMENT_NUMBER","O_B_PARTY_IMSI","O_B_PARTY_LOCATION_INFO_CELL_ID","O_APN","O_URL_ADDRESS","O_IP_ADDRESS","O_DIALLED_DIGITS","O_CALL_ESTABLISHMENT_REASON","O_TERMINATION_REASON","O_COMPENSATION_CODE","O_CALL_DIRECTION_CODE","O_EVENT_TYPE","O_EVENT_SUB_TYPE","O_SUPPLEMENTARY_SERVICE","O_CUSTOMER_ACCOUNT_INFORMATION","O_CHARGING_ID","O_PROVIDER_ID","O_ZONE_INDICATOR","O_ROUTING_PREFIX","O_SERVICE_CODE","O_NETWORK","O_ORIGINAL_FILE_NAME","O_MSC_IDENTIFIER","O_CIRCUIT_TRUNK_IDENTIFIERS","O_CALL_SOURCE_TYPE","O_CALL_START_TIMESTAMP","O_CALL_END_TIME","O_UNIT_OF_MEASURE","O_DURATION","O_VOLUME","O_UPLINK_DOWNLINK","O_MESSAGE_SIZE_VIDEO","O_GROSS_CHARGE","O_NET_CHARGE","O_CURRENCY","O_QOS_REQUESTED_RECEIVED","O_INBOUND_ROAMING_INDICATOR","O_OUTBOUND_MSRN","O_CONTENT_TYPE","O_CONTENT_PROVIDER_ID","O_CONTENT_ID","O_CONTENT_DESCRIPTION","O_TON_NPI_CALLING_CALLED","O_IN_GW_GSM_VPN_EVENT_INFO","O_IN_GW_CALL_TYPE","O_IN_GW_TERMINATION_TYPE","O_IN_GW_BUSINESS_GROUP","O_IN_GW_TRANSMISSION_TYPE","O_IN_GW_BUSINESS_PERSONAL_CALL","IN_PRE_INFO","O_CAMEL_SERVICE_KEY","O_CAMEL_SERVICE_LEVEL","O_CAMEL_SERVICE_USED","O_CAMEL_CALL_REFERENCE","O_CAMEL_MSC_ADDRESS","O_CAMEL_DESTINATION_NUMBER","O_ROAMING_TYPE","O_CAMEL_SCP_ADDRESS","O_CALL_REFERENCE","O_CALL_NUMBERS","O_SMS_SERVICECENTREADDRESS","O_VARCHAR_3","O_INPUT_RECORD_TYPE","O_VARCHAR_5","O_VARCHAR_6","O_VARCHAR_7","O_VARCHAR_8","O_VARCHAR_9"};
vector<std::string> fields(a,a+75);
vector<std::string> linesplit=split(all_lines[linenumber-1],',');
vector<std::string>::const_iterator itrecord=linesplit.begin();
vector<std::string>::const_iterator it=fields.begin();
int counter=1;
for(;it!=fields.end()||itrecord!=linesplit.end();counter++,++it,++itrecord)
{
cout << counter <<"\t"<<*it<<" "<<*itrecord<<endl;
}
return 0;
}
int main(int argc,char **argv)
{
vector<std::string> lines;
lines.reserve(5000);
/*getting the file name*/
string filename(argv[1]);
ifstream file;
file.open(filename.c_str());
if(!file.is_open())
{
cerr<<"Error opening file : "<<filename.c_str()<<endl;
return -1;
}
/*Read the lines and store it in the vector*/
string line;
while(getline(file,line))
{
lines.push_back(line);
}
file.close();
vector<std::string> lines_in_file=split(argv[2],',');
string detail_record("-show");
if(!detail_record.compare(*(lines_in_file.begin())))
{
int linetoshow=UsingATOI(*(++lines_in_file.begin()));
showrecord(lines,linetoshow);
}
getch();
}
这是输入文件的内容:
,2,353867835022;11,012268004278220,272023112983396,272-02f-20008-26217,3538353588202;11,,,,,,,08353588202b,3,00,,O,V,VOICE,,,11162812,,,17683,11,HPLMN,M10MSS_TTFILE_0650_20110414204840,M10MSS,W20B13I;0VMSGRI,1,20110414204447,204517,1,30,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001810,,,,06631f000a,1:353860295822::::08353588202b::3538353588202,,,MOC,,,,1,
,2,353867835022;11,012268004278220,272023112983396,272-02f-20008-26217,3538557137704;11,,,,,,,08557137704b,3,00,,O,V,VOICE,,,11162812,,,17687,11,HPLMN,M10MSS_TTFILE_0650_20110414204840,M10MSS,W20B13I;0VMSGRI,1,20110414204447,204517,1,30,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001810,,,,06631f000a,1:353860295822::::08557137704b::3538557137704,,,MOC,,,,,
,0,353867835022;11,,272023201187741,,353854100352;11,,,,,,,,3,04,,O,V,IPVMS,SS04,,971062,,,17685,,HPLMN,M30MSS_TTFILE_0511_20110606165900,M30MSS,W30EABI;0VMSGRI,,20110606185900,170900,1,600,,,,,,,,0,,,,,,,,,,,,,,00000014,Basic,,fdc45c001e,353868001830,353868001241,,353868001241,fdc45c001e,,,,,,,,,
,0,353867835022;11,,272023201187741,,353894201740;11,,,,,,,,3,04,,O,V,IPVMS,SS04,,971062,,,17684,,HPLMN,M30MSS_TTFILE_0511_20110606180901,M30MSS,W30EABI;0VMSGRI,,20110606180901,171901,1,600,,,,,,,,0,,,,,,,,,,,,,,00000014,Basic,,fdc45c001e,353868001830,353868001241,,353868001241,fdc45c001e,,,,,,,,,
,0,353867835022;11,,272023201187741,,353833588202;11,,,,,,,,3,04,,O,V,IPVMS,SS04,,971062,,,17683,,HPLMN,M30MSS_TTFILE_0511_20110606181902,M30MSS,W30EABI;0VMSGRI,,20110606181902,172902,1,600,,,,,,,,0,,,,,,,,,,,,,,00000014,Basic,,fdc45c001e,353868001830,353868001241,,353868001241,fdc45c001e,,,,,,,,,
,0,353867835022;11,,272023201187741,,353857137704;11,,,,,,,,3,04,,O,V,IPVMS,SS04,,971062,,,17687,,HPLMN,M30MSS_TTFILE_0511_20110606182903,M30MSS,W30EABI;0VMSGRI,,20110606182903,173903,1,600,,,,,,,,0,,,,,,,,,,,,,,00000014,Basic,,fdc45c001e,353868001830,353868001241,,353868001241,fdc45c001e,,,,,,,,,
,2,353868898655;11,354346049187430,272023112144539,272-02f-20008-24049,353894414476;11,,,,,,,353894414476,3,00,,O,V,VOICE,,,12649734,,,17684,11,HPLMN,M10MSS_TTFILE_6518_20110513104240,M10MSS,W20B13I;0GRI3,1,20110513104023,104130,1,67,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001810,,,,c6d299000a,1:353868898655::::353894414476::353894414476,,,,,,,,
,2,353872458299;11,358005031789960,272023112578235,272-02f-20025-15107,353876225788;11,,,,,,,353876225788,3,00,,O,V,VOICE,,,12664989,,,17683,11,HPLMN,M10MSS_TTFILE_6518_20110513104240,M10MSS,W20B03I;0GRI3,1,20110513104209,104226,1,17,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001810,,,,c7266e000a,1:353872458299::::353876225788::353876225788,,,,,,,,
,2,353872889489;11,354866045620160,272023112067271,272-02f-31011-11492,353863475401;11,,,,,,,0863475401,3,00,,O,V,VOICE,,,12668430,,,17685,11,HPLMN,M10MSS_TTFILE_6518_20110513104240,M10MSS,BLRC11I;0GRI3,2,20110513104213,104237,1,24,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001810,,,,c725a9000a,1:353872889489::::0863475401::353863475401,,,,,,,,
,2,353872889489;11,354866045620160,272023112067271,272-02f-31011-11492,353863475401;11,,,,,,,0863475401,3,00,,O,V,VOICE,,,12668430,,,17687,11,HPLMN,M10MSS_TTFILE_6518_20110513104240,M10MSS,BLRC11I;0GRI3,2,20110513104213,104237,1,24,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001810,,,,c725a9000a,1:353872889489::::0863475401::353863475401,,,,,,,,
,2,353867835022;11,353681041426390,272023201187741,272-02f-20017-06609,353854100351;11,,,,,,,0854100351,3,00,,O,D,DATA,,,7124395,,,17683,16,HPLMN,M20MSS_TTFILE_8377_20110605170245,M20MSS,W30B22I;0GRI3,1,20110605130014,170054,1,41,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001820,,,,b60a5c0014,1:353867835022::::0854100351::353854100351,,,,,,,,
,2,353867835022;11,353681041426390,272023201187741,272-02f-20017-06609,353854100353;11,,,,,,,0854100353,3,00,,O,D,DATA,,,7124395,,,17687,16,HPLMN,M20MSS_TTFILE_8377_20110605170245,M20MSS,W30B22I;0GRI3,1,20110605130014,170054,1,41,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001820,,,,b60a5c0014,1:353867835022::::0854100353::353854100353,,,,,,,,
,2,353867835022;11,353681041426390,272023201187741,272-02f-20017-06609,353894201740;11,,,,,,,0894201740,3,00,,O,D,DATA,,,7124395,,,17684,16,HPLMN,M20MSS_TTFILE_8377_20110605170245,M20MSS,W30B22I;0GRI3,1,20110605140015,170054,1,41,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001820,,,,b60a5c0014,1:353867835022::::0894201740::353894201740,,,,,,,,
,2,353830020353;11,353681041426390,272023201580328,272-02f-20017-06609,353854100352;11,,,,,,,0854100352,3,00,,O,D,DATA,,,7124395,,,17685,16,HPLMN,M20MSS_TTFILE_8377_20110605170245,M20MSS,W30B22I;0GRI3,1,20110605130015,170054,1,41,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001820,,,,b60a5c0014,1:353830020353::::0854100352::353854100352,,,,,,,,
每行保证有75个字段(表示74个逗号)。没有编译器错误。我像这样运行程序:
a.out text_file.txt -show,1
打印完最后一个字段后,程序崩溃并出现分段错误。代码有什么问题?我认为问题在于,即使该行有75个字段,如果最后一个字段为空,则最后一个逗号之后的下一个字符是换行符。但实时我无法更改输入数据文件,但如果最后一个字段不存在,我需要在代码本身处理这个问题。我在第74个逗号之后手动添加了一个随机数,然后代码工作正常,没有seg错误。
答案 0 :(得分:0)
一点也不清楚你要做什么,但有两件事情坚持下去 出:
fields
向量,尽管您从未对其进行修改。我也放弃75
:static char const* a[] = { ... }; static std::vector fields( begin( a ), end( a ) );
您正在迭代fields
的数量。如果一条线会发生什么
不包含那么多字段?结束条件应为it !=
fields.end() && itrecord != linesplit.end()
。或者您之前添加一些
确保有足够的字段的逻辑。
您的split
算法不正确。我见过这个提议
多次,但使用getline
不是一个合适的解决方案;
如果它没有提取任何字符(包括没有分隔符),它就会失败。您
可以通过系统地后缀分隔符使其工作;即
std::istringstream ss(s + ' ')
作为split
中的第一行,但我
仍然觉得它有误导性,并且更喜欢沿着这个方向发展
行:
std::vector split( std::string const& source, char delim ) { std::vector results; std::string::const_iterator curr = source.begin(); std::string::const_iterator end = source.end(); std::string::const_iterator next = std::find( curr, end, delim ); while ( next != end ) { results += std::string( curr, next ); curr = next + 1; next = std::find( curr, end, delim ); } results += std::string( curr, next ); return results; }
让我好奇的一件事是:你的调用(a.out ...
)是
显然是Unix,但你发布的代码不会在Unix下编译
(<conio.h>
和getch
)。那么你正在使用什么平台?