梅亚查  
我的地盘,写我的! 我的座右铭:认真对待每一件事,积极对待每一个人,用乐观的精神入世。 我的爱好:编程,足球,吉他,war3.
2007-11-15 09:45:00 
 c++处理文件 

    这几天闲来没事把机试的题目重新写了一遍,写完后与大庆以前写的比较,居然有很多相同的地方。
题目要求将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;
}

标签: 每天进步一点点
作者 kinhong 评论() | 人气()  | 引用() | 推荐 | 保存日志 | 问题日志 | 收藏到网摘 | 返回首页
 
友情链接