这几天闲来没事把机试的题目重新写了一遍,写完后与大庆以前写的比较,居然有很多相同的地方。
题目要求将y文件读出后按A字段排序输出,再按B字段排序后输出。其中A字段有13位,B字段有15位,很容易从中看出A字段是正常的手机号码,而B字段是国际号码。给出的文件记录是2000000条。
首先讲一下思路:
1,13位的数该怎么存,用int显然不行,因为int才4位,所以选用的是_int64。
2,就是stl中容器的使用这里因为有A字段和B字段所以我使用pair来保存一条记录,具体的做法的 pair< _int64, _int64 > pa; 然后再用vector< pair<_int64,_int64> >vec 来保存文件中的所有记录,并利用<algorithm>中的算法sort对vec中的记录按A字段或B字段进行排序。first_bigger(),和second_bigger()就是用来做排序的用的.sort()的第三个参数就是函数名。
3,读取文件的时候用file.read( buffer, get_lenth );注意程序不会自动在buffer中添加'\0',一开始我用while( buffer[ i ] != '\0')来判断文件是否结束,结果读出的文件总比原来的大。后来改用读入的参数来判断。
4,_atoi64( char * a )等函数的使用:从a字符开始,自动放弃所有的字符知道遇到'-'或数字,读入数字直到遇到非数字字符为止将其转化为_int64类型。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
const int a_lenth = 13;
const int b_lenth = 15;
const int get_lenth = 31 *1000;
bool first_bigger ( const pair< _int64,_int64 > &p1,const pair< _int64,_int64 > &p2 )
{
if ( p1.first > p2.first )
return 1;
else return 0;
}
bool second_bigger ( const pair< _int64,_int64 > &p1,const pair< _int64,_int64 > &p2 )
{
if ( p1.first > p2.first )
return 0;
else return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
ifstream ifile( "F:\\c++\\y\\y" );
ofstream ofile( "F:\\c++\\y\\A" );
if ( !ifile )
{
cout << "cannot open the file y located \"f:\\c++\\y \"";
return 1;
}
_int64 a ;
_int64 b;
pair < _int64, _int64 > p;
vector < pair< _int64,_int64 > > vec;
char buffer[ get_lenth ];
_int64 readnum = get_lenth;
int i = 0;
while ( ifile.read( buffer, get_lenth ) )
{
while ( i < get_lenth )
{
a = _atoi64( buffer + i );
b = _atoi64( buffer + i + 13 + 1);
p.first = a;
p.second = b;
vec.push_back( p );
i += 31;
}
cout << readnum << endl;
readnum += get_lenth;
i = 0;
}
ifile.close();
cin >> i;
cout << vec.size();
sort( vec.begin(), vec.end(), first_bigger );
for( vector < pair< _int64,_int64 > >::iterator it = vec.begin(); it != vec.end(); it ++ )
{
ofile << it->first << '|' << it->second << '|' << endl;
}
int q;
cin >> q;
return 0;
}