我想实现这样子的一个功能:
TempCode里存放一个三位数的编码,我想让他变成指定的六位数的编码Code。
指定编码的对照表是一个文件。
例子:
编码对照表:TempCode  Code
           001       321456 
           123       121245 
           564       465025
           452       546987
请问要怎么实现~?

解决方案 »

  1.   

    倒~我刚刚没有写清楚~
    就是我要在程序中实现这个用户输入TempCode后,我要把它通过这个对照表转换成这个六位的Code
    如:用户输入的TempCode为123,则要通过查找这个文件得到这个真实的Code为121245,再把这个121245传回程序的变量Code中。
      

  2.   

    athere_08(于斯) 兄说的就是一一对应啊 y = x
      

  3.   

    因为这个编码对照表很大,估计有几千条编码吧,所以它是存放在一个文件当中的至于文件格式可以随便,只要是程序能够调用就行.而且他们都是无序的。athere_08说的用数组实现我觉得不太可能。
      

  4.   

    就是说我在得到这个TempCode后,要怎么样读取文件内容并找到我想要的真实Code值再传回程序呢~?
      

  5.   

    存放在文档中就要设计好存档格式,然后从得到的输入在文档中查找对应的编码是多少。比如说 存档的格式是 input1 code1;input2 code2;input 3 code3; ...  这样设计一个查找文档的函数,通过input查找code. 
    另一个方法是用STL的数据类型vector,我也不是很熟,不清楚处理大数据怎么样,如果可以,那一定是很方便的。去看一下手册。
      

  6.   

    建一个大数组,读文件,以tempcode为下表变量,将对应的code值以值的形式存入数组。
        user input tempcode
        you can get tempcode_code[tempcode]
    如果tempcode不止是数字你可以将其转换成为ascii的值进行计算。
      

  7.   

    就像rainy14f(K.R.) 所说的那样,这个存档的格式可以我自己设定的。用INI文件也好,用文本文件也好,怎么方便就用哪个。
    我主要就是不知道怎么样读取文件内容并找到我想要的真实Code值。
    mostneed兄,你能不能直接把这段程序写出来呀~?
     
     
      

  8.   

    三位数和六位数,都在long范围以内
    三位数全部(000-999)也只有 1000种,最多占用内存
    1000*2*4=8000字节,不大,可以用数组
    int map[1000][2];
    就可以。如果您使用CMap会更好.
      

  9.   

    iceboy1980(原无尽)说的这样子要怎么实现?会不会因为有几千条纪录而很慢~?
      

  10.   

    你的tempcode是什么样的?是不是连续的?
      

  11.   

    回复人: rainy14f(K.R.) ( ) 信誉:100  2002-11-04 18:56:00  得分:0 
     
     
      就是字符串操作阿,像上面说的那样,如果各组之间用分号分隔,那么每次把每组的前一个数和输入比较,如果相同,就返回空格后面的字符串。
     
    对,就是这个~!问题是怎么实现!??!?! 例如我存放表的文件是code.txt 用空格进行分离,像这样子
    001       321456 
    123       121245 
    564       465025
    452       546987
      

  12.   

    TempCode不是连续的,每一个Code并不一定对应TempCode,但是每一个TempCode必定对应一个Code.如:
    例如我存放表的文件是code.txt 用空格进行分离,像这样子
    321456 001       
    121245 123       
    465025 
    546987 452
      

  13.   

    是不是这样:
    读取code.txt,先查tempcode,把空格作为字符串的结束,与你的输入相比较,看是不是一样。如果一样,那么就让程序继续读取空格后面的字符串,碰到分号就结束,这样,就可以返回code。 如果不一样,则查找下一个分号,然后取得分号后面的字符串。循环。
    具体的读文件和比较字符串的操作应该回了吧?已经说得很清楚了
      

  14.   

    rainy14f(K.R.) ( ) 信誉:100  2002-11-04 19:06:00  得分:0 是不是这样:
    读取code.txt,先查tempcode,把空格作为字符串的结束,与你的输入相比较,看是不是一样。如果一样,那么就让程序继续读取空格后面的字符串,碰到分号就结束,这样,就可以返回code。 如果不一样,则查找下一个分号,然后取得分号后面的字符串。循环。
    具体的读文件和比较字符串的操作应该回了吧?已经说得很清楚了说对了~就是因为具体怎么读文件及比较字符串我不会~不是说我不知道函数是什么,而是说我不知道像你刚刚上面说的这样子具体要怎么写~ 
     
      

  15.   

    强烈建议将文件内容读入内存,
    并转换成int类型。
    要知道
    在内存中找一个数,比在磁盘上找一个数快N个数量级。
    比较int的大小比比较string的大小快N个数量级!
      

  16.   

    : iicup(双杯献酒) ( ) 信誉:100  2002-11-04 19:14:00  得分:0 
     
    强烈建议将文件内容读入内存,
    并转换成int类型。
    要知道
    在内存中找一个数,比在磁盘上找一个数快N个数量级。
    比较int的大小比比较string的大小快N个数量级!说得不错~问题是怎么读呀~? 
     
      

  17.   

    你有没有msdn? 简单的说,fopen打开文件->fread读取文件->fclose关闭。
      

  18.   

    唉,说了这么多好像是白说。
    最关键问题就在这里我不会,如果是一个数组,fopen文件后,读文件时怎么样把前面三位数的读到一个前标变量,而将空格后的六位数读到下标变量~?然后读完后用循球进行比较这些都不是问题~~?
      

  19.   

    可不可以吧文件先处理一下,把前面的三位放到一个文件中,后面的六位在另一个文件中。并且他们的位置关系是对应的,就是说文件A的第n个记录就和文件B的第n条记录对应,并且文件A是排序的,便于查找。而文件B可以用在A中找到的位置来读取,
      

  20.   

    假设您的文件是自己定义的,
    可以直接定义成二进制文件,
    不要用文本类型。
    您就可以
    CStdioFile file;
    file.Open("文件名",modeRead|typeBinaray);//用二进制只读打开
    long map[1000][2];
    int len=file.GetLenght();//文件长度
    file.Read(map,len);//读数据
    file.Close();//关闭文件
      

  21.   

    回复人: athere_08(于斯) ( ) 信誉:100  2002-11-04 19:51:00  得分:0 可不可以吧文件先处理一下,把前面的三位放到一个文件中,后面的六位在另一个文件中。并且他们的位置关系是对应的,就是说文件A的第n个记录就和文件B的第n条记录对应,并且文件A是排序的,便于查找。而文件B可以用在A中找到的位置来读取,
    这样子的话也可以, 你能不能具体把这一段代码写出来~?
     
      

  22.   

    如果您喜欢用fopen fprintf fscanf
    您可以用
    int data[1000][2];
    int num;//对照表个数
    while(num=0;!feof(file);num++)
    {
     sscanf(fp,"%d",data[i][0]);//从文本格式读入整数
     sscanf(fp,"%d",data[i][1]);
    }
      

  23.   

    CStdioFile file;
    file.Open("文件名",modeRead|typeBinaray);//用二进制只读打开
    long map[1000][2];
    int len=file.GetLenght();//文件长度
    file.Read(map,len);//读数据
    file.Close();//关闭文件
    file.Read(map,len)这个能够把这个文件的内容全部读到map这个数组么?就是说map[1][1]为TempCode,map[1][2]为Code?我的那个二进制文件应该怎么写?
      

  24.   

    呵呵,data[i][0] 和 data[i][1]应该是
         &data[num][0]和 &data[num][1]
      

  25.   

    写二进制文件可以用
    CStdioFile file;
    file.Open("文件名",modeWrite|typeBinaray);//用二进制写打开
    long map[][2]={{123,123456},{345,908765},....};//假设您已经有数据
    file.Write(map,sizeof(map));//写数据
    file.Close();//关闭文件
      

  26.   

    谢谢双杯, 这个
    int data[1000][2];
    int num;//对照表个数
    while(num=0;!feof(file);num++)
    {
     sscanf(fp,"%d",&data[i][0]);//这个是读TempCode吗?
     sscanf(fp,"%d",&data[i][1]);// 这个是读Code吗?
    }
      

  27.   

    呵呵,又错了
    应该 fscanf
      

  28.   

    还是不用二进制了,比较麻烦,还是直接读文本文件吧.
    int data[1000][2];
    int num;//对照表个数
    while(num=0;!feof(file);num++)
    {
     sscanf(fp,"%d",&data[i][0]);//这个是读TempCode吗?
     sscanf(fp,"%d",&data[i][1]);// 这个是读Code吗?
    }
    按你这个读的话,它能识别空格前的读到data[i][0],空格后的读到data[i][1]吗?
      

  29.   

    您实验一下不就行了,
    反正就这几个函数.
    如果使用 fscanf,对应的写是
    fprintf
      

  30.   

    还是不用二进制了,比较麻烦,还是直接读文本文件吧.
    int data[1000][2];
    int num;//对照表个数
    while(num=0;!feof(file);num++)
    {
     fscanf(fp,"%d",&data[i][0]);//这个是读TempCode吗?
     fscanf(fp,"%d",&data[i][1]);// 这个是读Code吗?
    }
    按你这个读的话,它能识别空格前的读到data[i][0],空格后的读到data[i][1]吗?
      

  31.   

    fscanf和fprintf的用法,
    和scanf和printf是一致的,只是多一个文件指针的参数.
      

  32.   

    while(num=0;!feof(file);num++)
    {
     fscanf(fp,"%d",&data[i][0]);//这个是读TempCode吗?
     fscanf(fp,"%d",&data[i][1]);// 这个是读Code吗?
    }
    按你这个读的话,它能识别空格前的读到data[i][0],空格后的读到data[i][1]吗?并且读完一行后他能读下一行吗/
    能不能告诉我啊?如果可以的话,我就结贴了。
      

  33.   

    struct code{
    char x[3];
    char y[6];
    };main()
    {struct code cod[1000];
    FILE *fp;
    char* str;
    char s;
    int i,j;
    int pair=0;/*这是代码是否成对的标识,用来控制数组的输入.*/
    if((fp=fopen("filename","r"))==NULL)
       {printf("error");
        exit(0);
       }
    for(i=0;s!=EOF;)
     {str=NULL;
      s=fgetc(fp);
      while(s!='')
        { strcpy(str,s);
          s=fgetc(fp);
         }
      if(strlen(str)==3)
        { pair=0;
          for(j=0;(cod[i].x[j]=str++)!='\0';j++)
         }
      else
        if(strlen(str)==6)
          { i+=pair;
            for(j=0;(cod[i].y[j]=str++)!='\0';j++)
               {}
            pair=1;
          }
     }        
    }如果哪些地方不明白请再发贴,
    如果有些作用请照顾一下我的专家分...:)
      

  34.   

    程序main()
    {
     FILE* fp;
     fp=fopen("f:\\data.txt","r");
     int data[1000][2];
     int num;//对照表个数
     for(num=0;!feof(fp);num++)
     {
      fscanf(fp,"%d",&data[num][0]);//这个是读TempCode吗?
      fscanf(fp,"%d",&data[num][1]);// 这个是读Code吗?
     }
     int i;
     for(i=0;i<num;i++)
     {
      printf("\n X=%d\t Y=%d",data[i][0],data[i][1]);
     }
     fclose(fp);
     return 0;
    }文件 data.txt123 456000
    223 987654
    334  9987运行结果 X=123   Y=456000
     X=223   Y=987654
     X=334   Y=9987
      

  35.   

    有奖征答
    下列类用来将整数表示为二进制的字符串,例如3转换成"0000000000000011",
    请为该类重载+,-,INT运算符,并实现已经定义的两个构造函数.
    class Binary{
    char bits[16];
    public:
           Binary (char *);
       Binary (int);
    }
      

  36.   

    这个程序用标准C/C++来写可能是最快的:)假设转码映射文件名叫code.dat#include <fstream.h>#define MAX_LINE_SIZE   // code对应表中每一个对应行的最大长度
    /* 如:
               001       321456 
               123       121245 
               564       465025
               452       546987
               其中第一行的长度为{001      321456}的长度
    */main(int argc, char *argv[])
    {
        // argv[1]中存储的是你要查询的代码,如001,123等等
        char *szCode=argv[1];
        // 用于存储每一个CODE对应行的字符串 
        char szLine[MAX_LINE_SIZE];
        // 返回的对应码;
        char szReturn[6+1];    ifstream in("code.dat");
        
        while (!in.eof())
        {
             in>>szLine;
             if (szReturn=GetCodeMap(szLine, szCode)) break;
        }    cout<<szCode<<"  "<<szReturn<<"\n";    return 0;
    }
      

  37.   

    上面的程序并没有测试,我写了半天发的时候浏览器无响应了,
    吓了我一跳,以为白辛苦了,还好平安的贴上来了.
    程序是读字符串文件的,以前写过一个类似的文件通过了,
    今天大脑有点木,也许会有不妥的地方,希望对楼主有帮助就行了.iicup(双杯献酒) 你的程序好像并没有考虑楼主说的一种情况:
    就是6位码是唯一的,要是出现连续的两个6位码你的程序会出错的.
     
      

  38.   

    对计算机而言,二进制才是它所易于操作的,
    而文本文件仅仅适合(方便)人员阅读。所以,我仍然强烈建议您不要害怕二进制的文件操作。
    去熟悉它,您会觉得他很可爱。
    另外,现在更新的文件操作方式(一般也就更先进)是
    用流(iostream)和类(CFile),您应该努力尽量使用新的技术。
      

  39.   

    jesion(小新(敢吃青椒吗?)) () 信誉:100  2002-11-4 20:36:53  删除  
      上面的程序并没有测试, 
    能帮忙测试一下吗?我在网吧,没有工具~麻烦你了。
      

  40.   

    回复人: hediant(何) ( ) 信誉:100 
    你的这个程序我看不太懂~呵呵~
      

  41.   

    哈哈,关于visual_cjiajia() 所说的类我早就做过了,给自己用的时候非常方便:)尤其是在处理内存块,和块操作的时候:)一起包含这么几个类
    tbyte, 
    tword, 
    tdword, 
    tbytearray //这是一个字符数组,作用就更不用说了:)
      

  42.   

    data.txt改为
    123 456000
    223 987654
    456 987654
    334 799879运行结果
    123 456000
    223 987654
    456 987654
    334 799879
      

  43.   

    我上面写的程序是一个在C++下用流实现的文件IO过程:)GetCodeMap()是你要比较的代码映射部分:)用bash实现好象更快,如下说示:
    ##################################
    # 整个程序就下面这么多
    # 假设我们给这个脚本起个名字叫GetCodeMap[1] #!/bin/bash
    [2] IFS=" "  #设置空格为间隔符
    [3] while read tempCode Code
    [4] do
    [5]    if [tempCode==$1]; then
    [6]        echo $Code
    [7]        exit
    [8]    if
    [9] done#OVER~
    ######################################
    哇噻~~~一起9行代码,不到10行代码就解决问题了!
    爽不爽?:) 还包括了注释代码、为了方便的换行:)接下来就是如何使用问题,很简单
    $ ./GetCodeMap 001 < code.dat
    或者
    $ cat code.dat | GetCodeMap输出结果都会是321456升级!
    为了防止二义性的出现,建议你将code.dat文件改为
    001:321456 
    123:121245 
    564:465025
    452:546987
    ……这样,以上的GetCodeMap文件改为如下:[1] #!/bin/bash
    [2] IFS=:  #设置":"为间隔符
    [3] while read tempCode Code
    [4] do
    [5]    if [tempCode==$1]; then
    [6]        echo $Code
    [7]        exit
    [8]    if
    [9] done
      

  44.   

    TempCode不是连续的,每一个Code并不一定对应TempCode,但是每一个TempCode必定对应一个Code.如:
    例如我存放表的文件是code.txt 用空格进行分离,像这样子
    321456 001       
    121245 123       
    465025 
    546987 452
    iicup(双杯献酒) 就是这样的情况. 读数据的时候是以空格来作为
    标志判断是否是一个数据段的. 而数据是二个二个对应起来的.
    465025 546987 你如果不判断的话是否会成为对应关系?
    即结果会出现
    321456 001
    121245 123
    465025 546987
    452    ...楼主....5555....好像也不能帮你做测试了.
    我的情况跟你差不多,手头没有工具.万分报歉.