Author: Not specified Language: c
Description: Not specified Timestamp: 2013-05-26 18:39:54 +0000
View raw paste Reply
  1. #include <locale>
  2. #include <iostream>
  3. using namespace std;
  4.                                                                                                                                                                                      
  5. void ReadTableFromFile(void);
  6. void WriteTableToFile(void);
  7. void AddElement(void);
  8. void DelElement(void);
  9. void SearchRange(void);
  10. void OutTable(void);
  11. void Exit(void);
  12. int GetNum(void);
  13. const int   SIZE = 10;
  14. typedef struct Item
  15. {
  16.    int      key;      //???? ????????
  17.    int      seek;      //???????? ???? info ???????????? ?????? ????? ? ?????
  18.    int      len;      //????? info
  19.    Item   *next;      //????????? ?? ????. ???????
  20. }ITEM;
  21. char *mesMain[] =      //????????? ????
  22. {
  23.    "???????? ????? ???????",
  24.    "??????? ???????",
  25.    "????? ???????? ?? ????????? ??????",
  26.    "??????? ???????",
  27.    "?????"
  28. };
  29. //?????????? ??????? ????
  30. int MesMainCount = sizeof( mesMain ) / sizeof( mesMain[0] );
  31. //??????? ????????? ??????? ????
  32. void ( *funcMain[] )()={AddElement,
  33.                   DelElement,
  34.                   SearchRange,
  35.                   OutTable,
  36.                   Exit};
  37. int      StringsOff;      //?????? ????? ? ?????
  38. ITEM   *table[SIZE];   //???????-??????
  39. FILE   *file = NULL;   //????????? ?? ???????? ????
  40. char   fName[256];
  41. //?????? ??????? ?? ?????
  42. //?????? ?????:
  43. //int   StringsOff      - ?????? ????? ? ?????
  44. //ITEM   *table[SIZE]   - ??????? (???), ????? ??????? ???????? ??????? ?????????
  45. //...               - ?????? info
  46. void ReadTableFromFile()
  47. {
  48.    int      i;
  49.    ITEM   *pItem, *pItemPrev;
  50.    cout << "??????? ??? ?????: ";
  51.    cin.getline(fName, 256);   //?????? ??? ?????
  52.    file = fopen(fName, "r+b");   //????????? ?? ??????/??????, ??? ????????
  53.    if (NULL == file)         //???? ??? ??????
  54.    {
  55.       file = fopen(fName, "w+b");   //?? ??????? ????? ????
  56.       if (file)               //?????????
  57.       {                     //??????? ???? ? ?????? ????????
  58.                            //???????? ????? ????? ????? ???? ???? ??????????
  59.                            //? ?????? ???? ????????
  60.          StringsOff = sizeof(ITEM*) * SIZE + sizeof(int);
  61.                            //????? ???????? ????? ????? ? ?????
  62.          fwrite(&StringsOff, sizeof(int), 1, file);
  63.                            //??????? ?????? ??????????
  64.          fwrite(table, sizeof(ITEM*), SIZE, file);
  65.       }
  66.       else
  67.          cout << "?????? ???????? ?????" << endl;
  68.    }
  69.    else                     //???? ????
  70.    {                        //?????? ???????? ????? ????? ? ?????
  71.       fread(&StringsOff, sizeof(int), 1, file);
  72.       for (i=0; i<SIZE; i++)      //?????? ???????? ???????
  73.       {                     //?????? ????????? ? ???????
  74.          fread(&pItem, sizeof(ITEM*), 1, file);
  75.          if (pItem)            //????????? - ?????? ????? ????????!
  76.          {
  77.             while(pItem)      //?????? ??????? ?????????, ???? ????????? ?????????
  78.             {
  79.                pItem = new(ITEM);      //??????? ???????
  80.                if (table[i] == NULL)   //???????
  81.                   table[i] = pItem;   //?????????? ????????? ? ???????
  82.                else               //???????? - ?????? ?????? ? ??????????? ?? ????????
  83.                   pItemPrev->next = pItem;
  84.                                  //?????? ? ????? ???????
  85.                fread(pItem, sizeof(ITEM), 1, file);
  86.                pItemPrev = pItem;      //?????????? ????????, ??? ?????? ???????????
  87.                pItem=pItem->next;      //? ?????????? ? ??????? ????? ????? ????
  88.             }
  89.          }
  90.          else               //??????? - ????????? ???!
  91.             table[i] = NULL;
  92.       }
  93.    }
  94.    fclose(file);               //???? ?????????
  95. }
  96. //?????? ??????? ? ???? (? ????? ??????)
  97. void WriteTableToFile()
  98. {
  99.    ITEM   *pItem;
  100.    int      i, len;
  101.    fpos_t   pos;               //??????? ? ?????
  102.    void   *pStrings;            //????? ?????? ??? ?????? ??????? ?????
  103.    if (fName[0])               //???????? ?? ??????? ????? ?????
  104.    {
  105.       file = fopen(fName, "r+b");   //????????? ?? ??????/??????
  106.       if (file)               //?????????
  107.       {
  108.          //????????? ?????? ????? ?? ?????
  109.          //????????? ????? ?????
  110.          fseek(file, 0, SEEK_END);         //? ????? ?????
  111.          fgetpos(file, &pos);            //?????????? ???????
  112.          fseek(file, StringsOff, SEEK_SET);   //? ?????? ??????? ?????!
  113.          len = (int)pos - StringsOff;      //????? ??????? ?????
  114.          pStrings = malloc(len);            //??????? ?????? ??? ?????? ?????
  115.          fread(pStrings, len, 1, file);      //?????????
  116.          fseek(file, 0, SEEK_SET);         //??????? ? ?????? ?????!
  117.          
  118.          //????????? ????!
  119.          fwrite(&StringsOff, sizeof(int), 1, file);   //?????? ??????? ?????
  120.          //??????? ???????
  121.          for (i=0; i<SIZE; i++)
  122.          {
  123.             //????????? ?????? ??????? (??? 0)
  124.             fwrite(&table[i], sizeof(ITEM*), 1, file);
  125.             //??????? ????????? ???????
  126.             for (pItem=table[i]; pItem; pItem=pItem->next)
  127.                fwrite(pItem, sizeof(ITEM), 1, file);
  128.          }
  129.          //??????? ?????? ????? ? ????????? ????? ???????? ??????? ?????!
  130.          StringsOff = ftell(file);         //????? ??????? ????? ?????? ???????
  131.          
  132.          fwrite(pStrings, len, 1, file);      //????? ??????????? ?????? ?????
  133.          fseek(file, 0, SEEK_SET);         //? ?????? ?????!
  134.          fwrite(&StringsOff, sizeof(int), 1, file);   //? ????? ????? ???????? ??????? ?????
  135.          
  136.          fclose(file);                  //???? ?????????
  137.          free(pStrings);                  //??????????? ?????? ??? ??????
  138.       }
  139.       else
  140.          cout << "?????? ???????? ?????" << endl;
  141.    }
  142.    else
  143.       cout << "??? ????? ?? ??????" << endl;
  144. }
  145. //????? ???????? ? ?????, ???? ????????
  146. //?????????? ??? ?????????? ?????? ????????
  147. //?????????: ???? ? ????? ????????? ? ??????? next, ???? ??????? ????? ???????
  148. //??? NULL, ???? ??????? ?????
  149. //?????????? true, ???? ??????? ?????? ? false, ???? ?? ??????
  150. bool Find(int num, ITEM **ppItem)
  151. {
  152.    ITEM   *pItem;
  153.    int      i = num%SIZE;   //??????? ??????????? - ??????? ?? ??????? ?? SIZE=10
  154.                      //????????? - ??????????? ????
  155.    
  156.    //??????, ???? ?? ??? ???????? ????
  157.    //*ppItem ? ????? ????? ????????? ?? ?????????? ????????? ???????,
  158.    //????? ???????? ?? ??????? ?????
  159.    for (*ppItem=NULL,pItem=table[i]; pItem!=NULL; pItem=pItem->next)
  160.    {
  161.       *ppItem = pItem;   //?????????? ????????? ??????????? ??????????
  162.       //???? ??????? ????
  163.       if (pItem->key == num)   //???? ?????!
  164.          return true;   //???????
  165.    }
  166.    return false;         //?? ?????, ? *ppItem ????? ????????? ?????????? (??? NULL)
  167. }
  168. //????? ?? ???? ??????? ????????? ? ?????? ? ???????? ????????? [min, max]
  169. //??? ??????? ?????? ?????????? ?????? *idx = -1
  170. //????? ??????? ?????? ?? ???? ??????? ????? ???????????? ?????? ? ??????? ? ?????
  171. //???????????????? ??????? ????????.
  172. //????????? ????? ????? ????????? ? ???? ?? ?????.
  173. //?.?., ????? ????? ??? ???????? ? ?????
  174. bool FindRange(int min, int max, int *idx, ITEM **ppItem)
  175. {
  176.    ITEM   *pItem;
  177.    int      i;
  178.    if (min > max)      //?? ?????? ??????, ???????? min < max
  179.    {
  180.       i = min;
  181.       min = max;
  182.       max = i;
  183.    }
  184.    if (*idx == -1)      //?????? ??????
  185.    {
  186.       i = 0;         //???????? ? 0-?? ???????
  187.       pItem=table[0];
  188.    }
  189.    else            //??????????? ??????
  190.    {
  191.       i = *idx;      //??????
  192.       pItem = (*ppItem)->next;   //????????? ?? ????????????!
  193.    }
  194.    while (i<SIZE)      //?? ???? ???????
  195.    {
  196.       for(; pItem; pItem=pItem->next)   //?? ????????? ????? ???????
  197.       {
  198.          //????????? ??????? ????????? ????? ? ????????
  199.          if ((pItem->key >= min) && (pItem->key <= max))
  200.          {                     //?????
  201.             *idx = i;            //????????? ??????
  202.             *ppItem = pItem;      //? ????????? ?? ???????
  203.             return true;         //?????!
  204.          }
  205.       }
  206.       pItem=table[++i];            //?? ?????? ??????? ????????? ???????
  207.                               //??? ????????? ????? ?????????????? ?????
  208.                               //?? ?? ?????? ?? while(i<SIZE) !
  209.    }
  210.    return false;                  //?????? ???
  211. }
  212. //?????????? ???????? ? ???????
  213. void AddElement()
  214. {
  215.    int      num;      //?????? ?????? ????????
  216.    char   str[80];
  217.    ITEM   *pItem;      //????????? ?? ??????? ???????
  218.    ITEM   *pItemPrev;   //????????? ?? ???????, ????? ???????? ???????
  219.    cout << "??????? ???? ????????: ";
  220.    num = GetNum();      //?????? ????
  221.    if(Find(num, &pItemPrev))
  222.    {
  223.       cout << "??????? ? ????? ?????? ??? ????" << endl;
  224.       return;
  225.    }
  226.    pItem = new ITEM;            //??????? ????? ???????
  227.                            //????????? ????
  228.    pItem->key = num;            //????
  229.    pItem->next = NULL;            //??????? ?????????? ???????? ? ???????
  230.    cout << "??????? ??????: ";
  231.    cin.ignore();
  232.    cin.getline(str, 80);
  233.    if (fName[0])            //???????? ?? ??????? ????? ?????
  234.    {
  235.       file = fopen(fName, "r+b");   //?????????
  236.       if (file)               //?????????
  237.       {
  238.          //????????? ???????? ?????? ? ??????? ?????
  239.          fseek(file, 0, SEEK_END);            //?????????? ? ????? ?????
  240.          pItem->seek = ftell(file)-StringsOff;   //?????????? ???????, ???
  241.                                        // ???????? ? ??????? ????? ???? info
  242.          pItem->len = strlen(str)+1;            //?????????? ????? ??????
  243.          fwrite(str, pItem->len, 1, file);      //? ????? ?????? ? ????? ?????
  244.          fclose(file);                     //????????? ????
  245.          //??????????? ?? ??????? ?? ??? ???????
  246.          if (pItemPrev != NULL)         //???? ??????????? ?? ? ?????? ???????
  247.             pItemPrev->next = pItem;   //?? ?????????? ????? ?? ???? ?????????
  248.          else
  249.             table[num%SIZE] = pItem;   //???? ?????? ???????, ?? ?????????? ?????? ? ??????? table
  250.          cout << "??????? ????????" << endl;
  251.       }
  252.       else
  253.          cout << "?????? ???????? ?????" << endl;
  254.    }
  255.    else
  256.       cout << "??? ????? ?? ??????" << endl;
  257. }
  258. //????? ???????? ???? ??????
  259. //????? ????????? ?? ????????? ??????
  260. void SearchRange()
  261. {
  262.    int      i = -1;            //??? ?????? ? ?????? ???????
  263.    ITEM   *pItem;
  264.    int      count, min, max;
  265.    char   str[80];
  266.    cout << "??????? ???????????  ???? ?????????: ";
  267.    min = GetNum();      //?????? ????
  268.    cout << "??????? ???????????? ???? ?????????: ";
  269.    max = GetNum();      //?????? ????
  270.    
  271.    count = 0;         //?????????, ????? ?????????? ????? ??? ???
  272.    if (fName[0])         //??? ????? ???????
  273.    {
  274.       file = fopen(fName, "r+b");   //????????? ????
  275.       if (file)               //?????????
  276.       {
  277.          while (FindRange(min, max, &i, &pItem))
  278.          {
  279.             fseek(file, pItem->seek+StringsOff, SEEK_SET);   //?????????? ? ???????, ??? ?????????? ??????
  280.             fread(str, pItem->len, 1, file);            //?????? ?????? ????? ????
  281.                                  //???????
  282.             cout << "key = " << pItem->key            //????
  283.                 << ", info = " << str               //??????
  284.                 << endl;
  285.             count++;                           //???????
  286.          }
  287.          fclose(file);                           //???? ?????????
  288.       }
  289.       else
  290.          cout << "?????? ???????? ?????" << endl;
  291.    }
  292.    else
  293.       cout << "??? ????? ?? ??????" << endl;
  294.    if (0==count)               //??????? ?????????, ???? ?? ?????
  295.       cout << "???????? ?? ???????" << endl;
  296. }
  297. //???????? ???????? ? ???????? ??????
  298. //???? ?? ????????????.
  299. //???????? ?????????? ?????? ? ??????!
  300. void DelElement()
  301. {
  302.    int      i, num;
  303.    ITEM   *pItemPrev, *pItem, *pItemNext;
  304.    cout << "??????? ???? ????????: ";
  305.    num = GetNum();      //?????? ????
  306.    i = num%SIZE;      //??????? ??????????? - ??????? ?? ??????? ?? SIZE=10
  307.                   //????????? - ??????????? ????
  308.    //?? ???? ????????? ??????? ??? ???????????? ?????
  309.    for (pItemPrev=NULL,pItem=table[i]; pItem; pItem=pItemNext)
  310.    {
  311.       pItemNext = pItem->next;      //????????? ?? ??????????
  312.       //?????????? ????
  313.       if (pItem->key == num)
  314.       {                        //??????? ??????? ?? ??????? ??????????
  315.          if (pItemPrev == NULL)      //?????? ??????? ? ????????
  316.             table[i] = pItemNext;   //????? ? ?????? table ????? ??????????
  317.          else                  //?????, ?????????? ?????????
  318.             pItemPrev->next = pItemNext;   //?? ??????????
  319.          delete pItem;            //??????? ???????
  320.          cout << "??????? ??????" << endl;
  321.          return;
  322.       }
  323.       pItemPrev=pItem;            //???????? ????????? ?? ?????????? ???????
  324.    }
  325.    //?????? ??? ???????, ?????? ?? ?????
  326.    cout << "??????? ?? ??????" << endl;
  327. }
  328. //????? ???? ???????
  329. void OutTable()
  330. {
  331.    int      i, count = 0;   //????????? ????? ?????????
  332.    ITEM   *pItem;
  333.    char   str[80];
  334.    if (fName[0])         //??? ????? ???????
  335.    {
  336.       file = fopen(fName, "r+b");   //????????? ????
  337.       if (file)               //?????????
  338.       {
  339.          for(i=0; i<SIZE; i++)   //?? ???? ????????? ???????
  340.          {
  341.             //?? ???? ????????? ???????
  342.             for (pItem = table[i]; pItem; pItem=pItem->next)
  343.             {
  344.                fseek(file, pItem->seek+StringsOff, SEEK_SET);   //?????????? ? ???????, ??? ?????????? ??????
  345.                fread(str, pItem->len, 1, file);            //?????? ?????? ????? ????
  346.                cout << "key = " << pItem->key
  347.                    << ", info = " << str
  348.                    << endl;
  349.                count++;
  350.             }
  351.          }
  352.          fclose(file);               //???? ?????????
  353.       }
  354.       else
  355.          cout << "?????? ???????? ?????" << endl;
  356.    }
  357.    else
  358.       cout << "??? ????? ?? ??????" << endl;
  359.    if (0 == count)         //????????? ??? ?????? ???????
  360.       cout << "??????? ?????" << endl;
  361. }
  362. //?????, ?????? ??? ????????
  363. void Exit()
  364. {
  365.    ITEM   *pItem, *pItemNext;
  366.    WriteTableToFile();      //???????? ??????? ? ?????
  367.                      //?????? ???????? ??????? ?? ????? ?????????
  368.    for (int i=0; i<SIZE; i++)
  369.    {
  370.       for (pItem=table[i]; pItem; pItem=pItemNext)
  371.       {
  372.          pItemNext = pItem->next;      //???????? ???????? ?? ??????????
  373.          delete pItem;
  374.       }
  375.    }
  376. }
  377. //???? ?????
  378. int GetNum()
  379. {
  380.    int      a;
  381.    cin >> a;
  382.    while ( !( cin.good() || cin.eof() ) || ( a < 0 ) )
  383.    {
  384.       cout << "??????? ?????! " << endl;
  385.       cin.clear();
  386.       cin.ignore();
  387.       cin >> a;
  388.    }
  389.    return a;
  390. }
  391. //????? ???? ? ?????? ?????? ??????
  392. int ViewMenu(char** mes, int max)
  393. {
  394.    int ret;
  395.    do
  396.    {
  397.       //????
  398.       for ( int i = 0; i < max; i++ )
  399.          cout << i+1 << ". " << mes[i] << endl;
  400.       cout << "??? ?????: ";
  401.       //?????? ?????
  402.       ret = GetNum();
  403.    }
  404.    //???????? ?? ????????????
  405.    while ( ret < 1 || ret > max );
  406.    //?????? ????? ??????
  407.    return ret;
  408. }
  409. int main()
  410. {
  411.    int ret;
  412.    system("chcp 1251 >> nul");
  413. //    locale::global(locale("Russian_Russia.866")); //????? ???????? ??-??????
  414.    ReadTableFromFile();         //?????? ??????? ?? ????? (??? ??????? ?????)
  415.    do
  416.    {
  417.       ret = ViewMenu(mesMain, MesMainCount);   //??????? ????, ?????? ????? ??????
  418.       funcMain[ret-1]();                  //???????????? ????? ????
  419.       cout << "--------------------------------" << endl;
  420.       if (ret == MesMainCount)            //????????? - ?????
  421.          break;
  422.    }
  423.    while ( ret );
  424.    return 0;
  425. }
View raw paste Reply