seek¸¦ ÀÌ¿ëÇÑ ÆÄÀÏ À§Ä¡º¯°æ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

seek ¸¦ÀÌ¿ëÇÑ ÆÄÀϳ» À§Ä¡º¯°æ

1절. ¼Ò°³

À̹øÀå¿¡¼­´Â ÆÄÀϳ»¿¡¼­ÀÇ À§Ä¡À̵¿À» À§Çؼ­ ¾²ÀÌ´Â seek °è¿­ÀÇ ÇÔ¼ö¿¡ ´ëÇØ¼­ ¾Ë¾Æº»´Ù. ¿ø·¡´Â lseek¿Í fseek 2°³ ¸ðµÎ¿¡ ´ëÇØ¼­ ´Ù·ç¾î¾ß ÇϰÚÀ¸³ª. »ç¿ë¹ýÀÌ °ÅÀÇ µ¿ÀÏÇÔÀ¸·Î Àú¼öÁØ ÇÔ¼öÀÎ lseek ¸¸À» ´Ù·çµµ·Ï ÇÑ´Ù. fseek ´Â stdio.h »ç¿ëÇϱ⿡¼­ Àá±ñ ´Ù·ç¾úÀ½À¸·Î Âü°íÇϵµ·Ï ÇÏÀÚ.


2절. seek ¿¡ ´ëÇØ¼­

2.1절. ÆÄÀÏÀÇ À§Ä¡ÁöÁ¤ÀÇ Çʿ伺

Áö±Ý±îÁöÀÇ ÆÄÀϰü·Ã ÀÛ¾÷Àº óÀ½ºÎÅÍ Àо ¼ø¼­´ë·Î Ãâ·ÂÇϰųª ȤÀº ÆÄÀÏÀÇ ¸¶Áö¸·¿¡ µ¥ÀÌŸ¸¦ ¾²´Â ÀÏÀÌ¿´´Ù. ±×·¯³ª ÀÌ·¯ÇÑ ÀÛ¾÷¸¸À¸·Î´Â ÆÄÀϰü·ÃµÈ ¸ðµç ÀÛ¾÷À» È¿À²ÀûÀ¸·Î ¼öÇàÇϱⰡ Èûµé´Ù.

¿¹¸¦ µé¾î °£´ÜÇÑ DB ÆÄÀÏÀ» ¸¸µç´Ù°í °¡Á¤Çغ¸ÀÚ. ÀÌ·²°æ¿ì¿¡´Â ´ÜÁö ³¡¿¡ ³»¿ëÀ» Ãß°¡ÇÏ´Â°Í ¿Ü¿¡µµ, ƯÁ¤ À§Ä¡¿¡ ÀÖ´Â µ¥ÀÌŸ¸¦ °¡Á®¿À°Å³ª, ƯÁ¤À§Ä¡¿¡ ÀÖ´Â µ¥ÀÌŸ¸¦ »èÁ¦ÇÏ´Â µîÀÇ ÀÏÀ» ÇØ¾ß ÇÒ°ÍÀÌ´Ù. ¹°·Ð ²Ï ¹«½ÄÇÑ ¹æ¹ýÀ» »ç¿ëÇÒ¼ö ÀÖ´Ù. DB ÆÄÀÏÀÇ µ¥ÀÌŸ°¡ ±¸Á¶Ã¼·Î µé¾î°£´Ù¸é, ±¸Á¶Ã¼ÀÇ Å©±â¸¸Å­ °è¼ÓÀоîµé¾î¼­ ¿øÇÏ´Â ·¹ÄÚµå±îÁö ã¾Æ°¡´Â °ÍÀÌ´Ù. Áï µ¥ÀÌŸ°¡ 100 °³ ÀÖ°í, 99 ¹øÂ° µ¥ÀÌŸ¸¦ ã±â¸¦ ¿øÇÑ´Ù¸é

struct recode
{
    ...
};
int main()
{
    struct recode mydata;
    int fd, i;
    char buff[255];
    ....
    fd = open(...);
    for (i = 0; i < 99; i++)
        read(fd, (void *)&buff, sizeof(recode)); 
}
			
´ëÃæ À§¿Í °°Àº ½ÄÀ¸·Î µ¥ÀÌŸ¸¦ ã¾Æ°¡´Â ¹æ¹ýÀÌ´Ù. ±²ÀåÈ÷ ½ÉÇÃÇÏÁö¸¸ »ó´çÈ÷ ¹«½ÄÇÑ ¹æ¹ýÀÌ´Ù. ¾î¶µç ±×·¸°Ô ÇØ¼­ 99 ¹øÂ° µ¥ÀÌŸ¸¦ ã¾Ò´Âµ¥, À̹ø¿¡ ´Ù½Ã 97¹øÂ° µ¥ÀÌŸ¸¦ ã¾Æ¾ß ÇÑ´Ù¸é? ´Ù½Ã ÆÄÀÏÀ» open ÇØ¼­ 97¹ø µ¥ÀÌŸ¸¦ Àоîµé¿©¾ß Çϴ°¡?

´ç¿¬È÷ ±×·²ÇÊ¿ä ¾ø´Ù. ´ÙÇàÈ÷µµ À¯´Ð½º¿¡¼­´Â seek °è¿­ÀÇ ÇÔ¼öÀÎ lseek(2)¿Í fseek(3) À» Á¦°øÇؼ­ ÆÄÀÏÀÇ À§Ä¡¸¦ ÀÚÀ¯·Ó°Ô º¯°æÇÒ¼ö ÀÖµµ·Ï ÇØÁֱ⠶§¹®ÀÌ´Ù. lseek ¿Í fseek ÀÇ Â÷ÀÌÁ¡Àº lseek °¡ Àú¼öÁØÀÇ ÆÄÀÏÁöÁ¤ÀÚ ¸¦ ÅëÇØ¼­ ÀÛ¾÷À» ÇÏ´Â ¹Ý¸é fseek ´Â °í¼öÁØÀÇ ÆÄÀϽºÆ®¸²À» ÀÌ¿ëÇØ¼­ ÀÛ¾÷À» ÇÑ´Ù´Â °ÍÀÌ´Ù. ÀÏ´ÜÀûÀÎ text ¶ó¸é fseek ¸¦ ÀÌ¿ëÇØµµ °ü°è¾ø°ÚÀ¸³ª, ±¸Á¶Ã¼¿Í °°Àº binary µ¥ÀÌŸ¸¦ ´Ù·ç°íÀÚ ÇÑ´Ù¸é ¾Æ¹«·¡µµ Àú¼öÁØÇÔ¼öÀÎ lseek ¸¦ »ç¿ëÇÏ´Â°Ô ÁÁÀ»°ÍÀÌ´Ù.


2.2절. lseek() ÇÔ¼ö

ÆÄÀÏ¿¡¼­ À§Ä¡¸¦ ÀÚÀ¯ÀÚÀç·Î ¿Å°Ü´Ù´Ï±â À§Çؼ­ ÇÊ¿äÇѰÍÀº ¹«¾ùÀÏ±î »ý°¢ÇØ º¸ÀÚ. À¯Àú ÀÔÀå¿¡¼­ º¸¸é ÆÄÀÏÀº 1Â÷¿øÀ¸·Î µð½ºÅ©¿¡ ¿¬¼ÓÇØ¼­ À§Ä¡ÇØ ÀÖ´Â µ¥ÀÌŸÀÇ ¸ðÀ½ÀÌ´Ù(¹°·Ð OS ÀÔÀå¿¡¼­ º¸¸é ÆÄÀÏÀÇ µ¥ÀÌŸ°¡ ¹Ýµå½Ã ¿¬¼ÓµÇ¾î¼­ À§Ä¡ÇÏ´Â°Ç ¾Æ´Ï´Ù).

1Â÷¿ø¿¡¼­ ¾î¶² ¹°Ã¼ÀÇ ±Ô¸ð¸¦ ³ªÅ¸³»´Â ¿ä¼Ò´Â ±æÀ̰¡ µÉ°ÍÀÌ´Ù - 2Â÷¿øÀ̶ó¸é ¸éÀû, 3Â÷¿øÀ̶ó¸é üÀû -. º¸Åë 1Â÷¿ø¿¡¼­ ±æÀÌÀÇ Å©±â¸¦ ³ªÅ¸³»±â À§Çؼ­ ¿ì¸®´Â km, m ¿Í °°Àº 1Â÷¿ø ´ÜÀ§¸¦ »ç¿ëÇÑ´Ù. ÄÄÇ»ÅÍ¿¡¼­ µ¥ÀÌŸ Å©±âÀÇ ´ÜÀ§´Â ±âº»ÀûÀ¸·Î byte ÀÌ´Ù. ±×·³À¸·Î ¸¸¾à 16 byte ÀÇ µ¥ÀÌŸ°¡ ÀúÀåµÇ¾î ÀÖ´Ù¸é, À¯Àú ÀÔÀå¿¡¼­ ÀÌ µ¥ÀÌŸ´Â ´ÙÀ½°ú °°ÀÌ Disk »ó¿¡ Á¸ÀçÇÏ´Â °ÍÀ¸·Î º¸ÀϰÍÀÌ´Ù.

     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6                        
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--------------+
  | |                               | ´Ù¸¥ µð½ºÅ© ¿µ¿ª 
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--------------+
			
±×·¸´Ù¸é ³»°¡ 9¹øÂ° byte À§Ä¡·Î À̵¿ÇÏ°í ½Í´Ù¸é ¾î¶±ÇØ¾ß ÇÒ±î ? º¸Åë ¾î¶² À§Ä¡¸¦ ³ªÅ¸³¾¶§ ¿ì¸®´Â ÁÂÇ¥¸¦ »ç¿ëÇÑ´Ù. ÀÌ ÁÂÇ¥¿¡´Â 2°¡Áö Á¾·ù°¡ ÀÖÀ¸´Ï, »ó´ë ÁÂÇ¥¿Í Àý´ë ÁÂÇ¥°¡ ¹Ù·Î ±×°ÍÀÌ´Ù. Àý´ëÁÂÇ¥¶õ ¾î¶² Àý´ëÀûÀÎ À§Ä¡¸¦ ±âÁØÀ¸·Î ÇÏ¿© ÀÓÀÇÀÇ À§Ä¡¸¦ ¾Ë¾Æ³»±â À§Çؼ­ »ç¿ëÇÏ´Â ÁÂÇ¥¸ç, »ó´ëÁÂÇ¥¶õ ÀÓÀÇÀÇ À§Ä¡¸¦ ±âÁØÀ¸·Î ÇØ¼­ ƯÁ¤À§Ä¡¸¦ ¾Ë¾Æ³»±â À§Çؼ­ »ç¿ëÇÏ´Â ÁÂÇ¥ÀÌ´Ù.

¼­¿ï°ú ºÎ»ê»çÀÌ¿¡ ³ªÀÇ À§Ä¡¸¦ Àý´ëÁÂÇ¥¸¦ ÀÌ¿ëÇØ¼­ Ç¥½ÃÇϰíÀÚ ÇÑ´Ù¸é "³ª´Â Áö±Ý ¼­¿ï¿¡¼­ ¸î Km ¶³¾îÁøÁöÁ¡¿¡ ÀÖÀ½" ÀÌ·±½ÄÀ¸·Î Ç¥ÇöÀÌ °¡´ÉÇÒ°ÍÀÌ´Ù. ¼­¿ïÀÌ 0km ÁöÁ¡ÀÌ µÇ´Â °ÍÀÌ´Ù. ±×·¯³ª »ó´ëÁÂÇ¥Àϰæ¿ì ³ªÀÇ À§Ä¡°¡ 0km ÁöÁ¡ÀÌ µÇ¸ç ³ª¸¦ ±âÁØÀ¸·Î ¾î¶² À§Ä¡¸¦ ÁöÁ¤ÇÏ°Ô µÉ°ÍÀÌ´Ù.

 ¼­¿ï                   ³ª        ¸¶»ê                 ºÎ»ê
  +----------------------+----------+--------------------+
  |                      |          |
  +--------- 180 km -----+-- 20km --+ 
  |                                 | 
  +------------- 200 km ------------+
  ¸¶»ê±îÁöÀÇ °Å¸® 
  Àý´ëÁÂÇ¥ »ó¿¡¼­ : 200 km 
  »ó´ëÁÂÇ¥ »ó¿¡¼­ : 20  km (±âÁØ "³ª")  
			

ÀÌ·¯ÇÑ À§Ä¡¸¦ ¾Ë¾Æ³»±â À§Çؼ­ Çö½Ç¿¡¼­ »ç¿ëµÇ´Â ±â¹ýÀÌ DISK »ó¿¡¼­µµ ±×´ë·Î Àû¿ëµÈ´Ù. Áï ÆÄÀÏÀÇ Ã³À½ ½ÃÀÛÁöÁ¡ÀÎ 0 À» À§Ä¡·Î ½ÃÀÛÁöÁ¡¿¡¼­ ¶³¾îÁø byte ¼ö¸¸Å­À¸·Î °è»êÇÏ´Â ¹æ¹ý°ú, ÇöÀç ÆÄÀÏÁöÁ¤ÀÚ°¡ À§Ä¡Çϰí ÀÖ´Â À§Ä¡¿¡¼­ byte ¼ö¸¸Å­À» °è»êÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù.

¿¹¸¦ µéÀÚ¸é ÇöÀç ÆÄÀÏÁöÁ¤ÀÚ°¡ °¡¸£Å°´Â °÷ÀÌ 7 À̰í À̵¿ÇϰíÀÚ ÇÏ´Â °÷ÀÌ 12 À϶§, óÀ½ºÎÅÍ ½ÃÀÛÇØ¼­ 12 ¸¸Å­ ÆÄÀÏÁöÁ¤ÀÚ¸¦ À̵¿½ÃŰ´Â ¹æ¹ý°ú ÇöÀç À§Ä¡¿¡¼­ ½ÃÀÛÇØ¼­ 5¸¸Å­À» À̵¿½ÃŰ´Â ¹æ¹ýÀÌ ÀÖÀ»°ÍÀÌ´Ù.

lseek ¸¦ ¼³¸íÇϱâ À§Çؼ­ ÀÌ·±Àú·± ¾ê±â¸¦ ¸¹ÀÌ Çߴµ¥, lseek ´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);  
			
fd ´Â ÆÄÀÏÁöÁ¤ÀÚÀÌ´Ù. ¹Ù·Î 2 ¹øÂ° offset ÀÌ °Å¸®¸¦ ³ªÅ¸³»±â À§Çؼ­ »ç¿ëµÈ´Ù. ±×·¸´Ù¸é ±âÁØÁ¡Àº ? ´ç¿¬ÇϰÚÁö¸¸(--;) whence ¸¦ ÀÌ¿ëÇÏ°Ô µÈ´Ù. whence °ªÀÌ ÀÌ whence ´Â ´ÙÀ½°ú °°Àº °ªÀ» »ç¿ëÇÒ¼ö ÀÖ´Ù.

SEEK_SET

ÆÄÀÏÀÇ ½ÃÀÛÁ¡ÀÌ´Ù. À̸¦Å׸é Àý´ëÀ§Ä¡¸¦ °è»êÇϱâ À§ÇÔÀÌ´Ù.

SEEK_CUR

ÆÄÀÏÁöÁ¤ÀÚ fd °¡ À§Ä¡Çϰí ÀÖ´Â ÁöÁ¡À» ±âÁØÀ¸·Î °è»êµÈ´Ù. À̸¦Å×¸é »ó´ëÀ§Ä¡¸¦ °è»êÇϱâ À§ÇÔÀÌ´Ù.

SEEK_END

ÆÄÀÏÀÇ ¸¶Áö¸·À§Ä¡ÀÌ´Ù. SEEK_SET ¿Í ¸¶Âù°¡Áö·Î Àý´ë°ªÀ̶ó°í ÇÒ¼ö ÀÖ´Ù ´Ù¸¸ ±âÁØÁ¡ÀÌ ÆÄÀÏÀÇ ¸¶Áö¸·À̶ó´Â °Í¸¸ ´Ù¸£´Ù.

lseek ¸¦ ÅëÇÑ À§Ä¡ À̵¿Àº whence ¿¡¼­ÀÇ offset À» ´õÇÔÀ¸·Î½á ÀÌ·ç¾î Áö°Ô µÈ´Ù. ¿¹¸¦µé¾î¼­ ÆÄÀÏÀÇ Ã³À½ À§Ä¡·Î À̵¿ÇÏ°í ½Í´Ù¸é lseek(fd, 0, SEEK_SET) ÇÏ¸é µÈ´Ù. ¸¶Áö¸·Àº lseek(fd, 0, SEEK_END) ÀÌ´Ù. ´ç¿¬È÷ offset Àº À½¼ö°ªÀÌ µé¾î°¥¼öµµ ÀÖ´Ù. ´ÙÀ½ÀÇ ¿¹¸¦ º¸ÀÚ.

¿¹Á¦ : seek.c

#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
    int fd ;
    char buff[255];
    memset(buff, 0x00, 255);

    fd = open("test.txt", O_RDONLY);
    if (fd < 0)
    {
        perror("error : ");
        exit(0);
    }

    lseek(fd, -3, SEEK_END);
    read(fd, buff, 255);
    printf("%s", buff);

    close(fd);
}
			
test.txt ÆÄÀÏ¿¡´Â "01234567890\n" ÀÌ µé¾î ÀÖ´Ù°í °¡Á¤Çϸé À§ÀÇ ÇÁ·Î±×·¥ ½ÇÇà°á°ú·Î "90\n" ÀÌ ÂïÈú°ÍÀÌ´Ù.

Âü°í·Î ½Ç¼ö·Î ÆÄÀÏÀÇ ¸¶Áö¸·À» Ãʰú ÇØ¼­ lseek ¸¦ »ç¿ëÇßÀ»°æ¿ì - lseek(fd, 10, SEEK_END)°ú °°ÀÌ - lseek ¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÏÁø ¾ÊÁö¸¸ write ȤÀº read ÇÒ°æ¿ì ¿¡·¯°¡ ¹ß»ýÇÏ°Ô µÇ¹Ç·Î ÁÖÀÇ ÇØ¾ß ÇÑ´Ù.



2.3절. lseek ÀÀ¿ë

À§ÀÇ lseek ¸¦ ÀÌ¿ëÇØ¼­ °£´ÜÇÑ ÀÀ¿ë ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µé¾î º¸ÀÚ.

¸¸µé°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥Àº °£´ÜÇÑ Çü½ÄÀÇ DB ¾îÇø®ÄÉÀ̼ÇÀÌ´Ù. ÀÌ ¾îÇø®ÄÉÀ̼ÇÀÌ °¡ °ü¸®ÇÏ´Â DB ´Â À̸§°ú ÀüÈ­¹øÈ£ÀÌ´Ù. DB ¿¡´Â À̸§°ú ÀüÈ­¹øÈ£¸¦ ¸â¹öº¯¼ö·Î ÇÏ´Â ±¸Á¶Ã¼°¡ ÀúÀåµÇ´Â Çü½ÄÀ» ÃëÇÏ°Ô µÉ°ÍÀÌ´Ù.


2.3.1절. DB ¸í¼¼ ¹× ÆÄÀϱ¸Á¶

DB °ü¸® ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µéÀû¿¡ °¡ÀåÁß¿äÇÑ°Ç DB ¸í¼¼¿Í ÀÌ DB ¸í¼¼¸¦ Áö¿øÇÒ¼ö ÀÖ´Â ÆÄÀϱ¸Á¶ÀÏ °ÍÀÌ´Ù. DB ´Â ´ÜÀϱ¸Á¶Ã¼°¡ ÇϳªÀÇ ·¹ÄÚµå´ÜÀ§°¡ µÇ¾î¼­ ¿¬¼®µÇ°Ô ÀúÀåµÉ °ÍÀÌ´Ù. ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°´Ù.

typedef struct _data
{
    int  num;
    char name[16];
    char tel_num[16];
} Data;
				
name Àº À̸§À̰í tel_num Àº ÀüÈ­¹øÈ£ÀÌ´Ù. num Àº ÀϷùøÈ£Àε¥, ¾îÇø®ÄÉÀ̼ǿ¡¼­ ÀÚµ¿ÀûÀ¸·Î ºÎ¿©ÇÏ°Ô µÉ°ÍÀÌ´Ù.

´ÙÀ½Àº DB ÆÄÀÏ ¸í¼¼ÀÌ´Ù.

 ´ÜÀ§ : byte
  0 1 2 3 4 5 6 7 8 9 0 1  .......
 +-+-+-+-+-+-+-+-+-+-+-+-+-------------+-------------+
 |DBINFO |R_NUM  |INC_NUM| RECODE 1... | RECODE 2... |
 +-+-+-+-+-+-+-+-+-+-+-+-+-------------+-------------+
				
DBINFO ´Â DB ¾îÇø®ÄÉÀ̼ÇÀÌ ÀÌ ÆÄÀÏÀÌ ÀÚ½ÅÀÌ °ü¸®ÇÏ´Â Æ÷¸ËÀ» Áö¿øÇÏ´Â ÆÄÀÏÀÎÁö¸¦ ¾Ë·ÁÁÖ±â À§Çؼ­ »ç¿ëÇÑ´Ù. Á¦´ë·Î ÇÏ·Á¸é ¹öÁ¯Á¤º¸¿Í °°Àº ºÎ°¡ÀûÀÎ Á¤º¸µµ µé¾î°¡¸é ÁÁ°ÚÁö¸¸ ¿©±â¿¡¼­´Â ´ÜÁö ÆÄÀÏÀÇ °¡Àå¾Õ¿¡ "MYDB"¶ó´Â ¹®ÀÚ¸¦ ½áÁÖ°í ¾îÇø®ÄÉÀ̼ÇÀº ÆÄÀÏÀ» ÀоîµéÀ϶§ MYDB ¹®ÀÚ¿­À» È®ÀÎÇÏ´Â Á¤µµ·Î DBÆÄÀÏÀ» ÆÇº°ÇÏ´Â °ÍÀ¸·Î ÇϰڴÙ.

R_NUM Àº ÇöÀç ÀÌ DB ÆÄÀÏÀÌ ¸î°³ÀÇ Recode ¸¦ Æ÷ÇÔÇϰí ÀÖ´ÂÁö¸¦ ³ªÅ¸³½´Ù. insert °¡ ÀÖÀ»°æ¿ì Áõ°¡Çϰí delete °¡ ÀÖÀ»°æ¿ì °¨¼ÒÇÒ °ÍÀÌ´Ù.

INC_NUM Àº Recode ¿¡ ÀϷùøÈ£¸¦ ÁÖ±â À§Çؼ­ »ç¿ëµÇ¸ç, Áõ°¡¸¸ ÇÏ¸ç °¨¼ÒÇÏÁö´Â ¾Ê´Â´Ù. Data.num ¿¡ °ªÀ» ÁÙ¶§ INC_NUM À» ÁÖ°Ô µÈ´Ù.

Recode ÀÇ »èÁ¦ÀÇ °æ¿ì ½ÇÁ¦ µ¥ÀÌŸ »èÁ¦°¡ ÀϾÁö´Â ¾ÊÀ¸¸ç ´ÜÁö ÇØ´ç ·¹ÄÚµåÀÇ Data.num ÀÇ °ª¿¡ (-1) À» °öÇØÁÖ´Â °ÍÀ¸·Î "»èÁ¦Ç¥½Ã"¸¸ ÇÒ°ÍÀÌ´Ù. ÀÌ·¸°Ô ÇÏ´Â ÀÌÀ¯´Â ³ªÁß¿¡ µ¥ÀÌŸ¸¦ º¹±¸ÇÒ¼ö ÀÖ´Â ¿©Áö¸¦ ³²°ÜÁÖ´Â°Í ¿Ü¿¡µµ(´ÜÁö Data.num*(-1)¸¸ ÇØÁÖ¸é º¹±¸µÈ´Ù) ÀüüÀûÀÎ ¾îÇø®ÄÉÀ̼ÇÀÇ ¼º´ÉÀ» Çâ»ó½Ãų¼ö Àֱ⠶§¹®ÀÌ´Ù. ¸¸¾à¿¡ ·¹Äڵ带 ½ÇÁ¦·Î Áö¿ì°Ô µÈ´Ù¸é, ºñ¿öÁø °÷À» ä¿ì±â À§Çؼ­ ±×µÚ¿¡ ÀÖ´Â ¸ðµç ·¹Äڵ带 ¾Õ´ç°Ü¼­ ºó·¹ÄÚµå °ø°£À» ä¿öÁà¾ß ÇÒ°ÍÀÌ´Ù. À̰ÍÀº ¸¹Àº ¼º´ÉÀÇ ¼Õ½ÇÀ» °¡Á®´Ù ÁØ´Ù. ƯÈ÷ ¿©·¯¸íÀÌ µ¿½Ã¿¡ ÀÛ¾÷À» ÇÏ´Â °ÍÀ» ¿°µÎ¿¡ µÎ°í ¾îÇø®ÄÉÀ̼ÇÀÌ °³¹ßµÉ°æ¿ì ·¹ÄÚµå Àá±Ý°ú ÆÄÀÏÀá±Ý ±×¸®°í ·¹ÄÚµåÀÇ À§Ä¡¸¦ »ç¿ëÀÚ°£¿¡ ¸ðµÎ µ¿±â½ÃÄÑÁà¾ß ÇÏ´Â ¸Å¿ì ±î´Ù·Î¿î ¹®Á¦¸¦ ÇØ°áÇØ¾ß ÇÑ´Ù. ±×·¯³ª "Ç¥½Ã"¸¸ ÇØ³õÀ»°æ¿ì¿¡´Â ¾îÇø®ÄÉÀ̼ÇÀÌ ÀÌ "Ç¥½Ã"¸¸ ÀÐ°í ÆÇ´ÜÇÏ¸é µÊÀ¸·Î ±¸ÇöÇϱⰡ ¸Å¿ì °£´ÜÇØ Áø´Ù.

½ÇÁ¦ Oracle °°Àº°æ¿ìµµ DB »èÁ¦µîÀÌ ÀϾÀ»¶§, °ð¹Ù·Î Áö¿ìÁö ¾Ê°í ´ÜÁö "Ç¥½Ã" ¸¸ ÇØµÎ°í Á¤¸®ÇØ¾ßµÉ ÀÏÀÌ ÀÖÀ»¶§ DBA°¡ Á¤¸®¸¦ ÇØÁÖ¸ç, (»èÁ¦ Ç¥½ÃµÈ ·¹Äڵ带 Á÷Á¢ Áö¿öÁÖ°í ºó·¹ÄÚµå °ø°£À» ¾ø¾ÖÁÖ´Â) ¸¸¾àÀÇ °æ¿ì º¹±¸ÇÒ¼ö ÀÖ´Â ¿©Áö¸¦ ³²°ÜµÐ´Ù. °ø°³ RDBMS ÀÎ Postgresl ¿ª½Ã delete µîÀÌ ³»·ÁÁ³À»¶§ ¹°¸®ÀûÀ¸·Î µ¥ÀÌŸ¸¦ »èÁ¦ÇÏÁö ¾ÊÀ¸¸ç, "»èÁ¦Ç¥½Ã" µÈ ü·Î °ø°£À» Â÷ÁöÇÏ¸ç ³²¾Æ ÀÖ°Ô µÈ´Ù. ÀÌ°Ô Á¡Á¡ ½×Àϰæ¿ì ÆÄÀÏÀÇ Å©±â°¡ Ä¿Áö°í, ÀüüÀûÀÎ ¼º´ÉÀÌ ¶³¾îÁüÀ¸·Î vacuum µîÀÇ µµ±¸¸¦ ½á¼­ Á¤¸®ÇØÁØ´Ù.


2.3.2절. ±â´É

lseek ÀÇ »ç¿ë¹æ¹ý ¿Ü¿¡µµ ¸î°¡Áö ºÎ¼öÀûÀÎ Á¤º¸¸¦ ¾òÀ»¼ö ÀÖ°ÚÁö¸¸ ¾îµð±îÁö³ª ÁÖ ¸ñÀûÀº lseek ÀÇ »ç¿ë¹ý¿¡ ´ëÇÑ ³»¿ëÀÌ´Ù. ±×·¯¹Ç·Î ±³°ú¿¡¼­ º½Á÷ÇÑ ÁøÂ¥ ±×·²µíÇÑ DB ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µéÁö´Â ¾ÊÀ»°ÍÀÌ´Ù. °¡Àå °£´ÜÇÑ ¼öÁØÀÇ DB ¾îÇø®ÄÉÀ̼ÇÀÌ µÉ°ÍÀÌ´Ù.

¸®½ºÆ®º¸±â

¸ðµç ·¹ÄÚµåÀÇ ¸®½ºÆ®¿Í Á¤º¸¸¦ º¸¿©ÁØ´Ù.

¸®½ºÆ®Ãß°¡

»õ·Î¿î ·¹Äڵ带 Ãß°¡ÇÑ´Ù. ·¹ÄÚµå Ãß°¡´Â Data ±¸Á¶Ã¼¸¦ write ÇÔÀ¸·Î½á ÀÌ·ç¾îÁö¸ç À̶§ R_NUM, INC_NUM ÀÌ 1¾¿ Áõ°¡ÇÏ°Ô µÈ´Ù. Data.num Àº INC_NUM ÀÌ µé¾î°¡°Ô µÈ´Ù.

¸®½ºÆ®»èÁ¦

ÁöÁ¤µÈ ·¹Äڵ带 »èÁ¦ÇÑ´Ù. R_NUMÀº 1 °¨¼ÒµÈ´Ù. ±×·¯³ª INC_NUMÀº °¨¼ÒµÇÁö ¾Ê´Â´Ù.

¸®½ºÆ®¾÷µ¥ÀÌÆ®

³»¿ëÀ» ¾÷µ¥ÀÌÆ® ÇÑ´Ù. ¿©±â¿¡¼­´Â ±¸ÇöÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù. Á÷Á¢ ±¸ÇöÇØ º¸±â ¹Ù¶õ´Ù.


2.3.3절. ÀÎÅÍÆäÀ̽º

ncurses ¸¦ »ç¿ëÇÏ´Â°Ç ³Ê¹« ¸¹Àº ½Ã°£ÀÌ °É¸±°Í °°¾Æ¼­ ±×³É °£´ÜÇÏ°Ô ANSI ¸¦ »ç¿ëÇϱâ·Î Çß´Ù. ANSI ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ¾È½Ã »ç¶û³Ý¸¦ Âü°íÇϱ⠹ٶõ´Ù. ANSI ÄÚµåÀÇ ÀÔ·ÂÀº CTRL+V,CTRL+[ ÇÑ´ÙÀ½¿¡ "[¾È½Ã¹øÈ£" ÀÌ´Ù. ¿¹¸¦µéÀÚ¸é È­¸éÀ» Áö¿ì±â À§ÇÑ ¾È½Ã ¹øÈ£´Â 2J Àε¥, ÀÌ ¹øÈ£¸¦ ÀÌ¿ëÇØ¼­ ¾È½ÃÄڵ带 ¸¸µé·Á¸é CTRL+V,CTRL+[ ŰÀÔ·ÂÈÄ [2J ÇÏ¸é µÈ´Ù.


2.3.4절. ¿¹Á¦ÄÚµå

´ÙÀ½Àº ½ÇÁ¦ ÀÛµ¿µÇ´Â ¿¹Á¦ ÄÚµåÀÌ´Ù. ¾î·Á¿î ³»¿ëÀº ¾øÀ½À¸·Î ÁÖ¼®À¸·Î ´ë½ÅÇϵµ·Ï ÇϰڴÙ. ¾Æ·¡ÄÚµå´Â ÇнÀ¸ñÀûÀ¸·Î ¿¬½À»ï¾Æ ¸¸µç ÄÚµåÀÌ´Ù. ¿¡·¯Ã³¸®, ÀÔÃâ·Â°Ë»ç, ÄÚµå È¿À²¼º, ÀÎÅÍÆäÀ̽º µîÀº ¿°µÎ¿¡ µÎÁö ¾ÊÀº ÄÚµåÀÌ´Ù. ¼û¾îÀÖ´Â ¹ö±×¸¦ Àâ°Å³ª ±ú²ýÇÏ°Ô Äڵ带 ´Ù½Ã ¸¸µé¾î º¸´Â°Íµµ ¸¹Àº µµ¿òÀÌ µÉ°ÍÀÌ´Ù.

¿¹Á¦ : seek_db.c

#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

// DB Æ÷¸Ë È®Àοë
#define APPNAME "MYDB"

// ANSI ÄÚµå 
// ½ºÅ©¸° Áö¿ì±â
#define SCR_CLEAR printf("^[[2J")
// x,y ÁÂÇ¥·Î Ä¿¼­À̵¿Çϱâ
#define MOVE_CURSOR(x, y) printf("^[[%d;%dH", x, y)

// ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ°í »ç¿ëÀÚ ÀÔ·ÂÀ» ±â´Ù¸°´Ù. 
// ½ºÅ©¸° Áö¿ì±â Àü¿¡ ¸Þ½ÃÁö¸¦ È®ÀÎÇÒ ¸ñÀûÀ¸·Î 
// »ç¿ëµÈ´Ù. 
#define WAIT_INPUT(x) printf("%s", x);getchar() 

// °³Ç๮ÀÚ Á¦°Å
#define chop(str) str[strlen(str)-1] = '\0'; 

// Çì´õÀÇ Å©±â Á¤ÀÇ  
// Çì´õ´Â recode ¸¦ Á¦¿ÜÇÑ ÆÄÀÏÀÇ °¡Àå¾Õ¿¡ ÀÖ´Â 
// Á¤º¸ÀÌ´Ù. 

// DB Æ÷¸Ë Á¤º¸ Å©±â 
#define DBINFO_SIZE strlen(APPNAME) 
// R_NUM,INC_NUM Å©±â
#define INDEX_SIZE sizeof(int)*2 
// Àüü Çì´õ Å©±â
#define HEADER_SIZE INDEX_SIZE + DBINFO_SIZE

// ¸ÞÀθ޴º 
char *menu =
"
µ¥ÀÌŸ¼ö : %d 
====================
1. ¸®½ºÆ® º¸±â
2. ¸®½ºÆ® Ãß°¡
3. ¸®½ºÆ® »èÁ¦ 
4. Á¾·á
==================== 
input : ";

// ·¹ÄÚµå ÀÔ·Â ¸Þ´º
char *input_menu = 
"
¹ø   È£  :
ÀÌ   ¸§  :
ÀüÈ­¹øÈ£ : 
";

// ·¹ÄÚµå ±¸Á¶Ã¼
typedef struct _data
{
    int  num;          // ÀϷùøÈ£
    char name[16];       // À̸§
    char tel_num[16];  // ÀüÈ­¹øÈ£
} Data;

//  R_NUM, INC_NUM
typedef struct _index_num
{
    int datanum;    // R_NUM   : µ¥ÀÌŸ ÃѰ¹¼ö
    int incnum;     // INC_NUM : µ¥ÀÌŸ ÀϷùøÈ£ 
} Index_num; 


// Index_num °ª Áï R_NUM °ú INC_NUM 
// À» ¾ò¾î¿Â´Ù.  
Index_num get_indexnum(int fd)
{
    Index_num index_num;
    lseek(fd, DBINFO_SIZE, SEEK_SET);
    read(fd, (void *)&index_num, HEADER_SIZE);
    return index_num;
}

// DB ÆÄÀÏÀ» üũÇÑ´Ù. 
// ÆÄÀÏÀÇ Ã³À½ 4¹ÙÀÌÆ® ¹®ÀÚ°¡ APPNAME °ú °°À¸¸é Âü 
int dbcheck(fd)
{
    char dbname[8];
    memset(dbname,0x00,8); 
    read(fd, dbname, 8);
    if (strncmp(dbname, APPNAME, DBINFO_SIZE) ==0) 
        return 1;
    else
        return -1;
}

// ÃÖÃÊ¿¡ DBÆÄÀÏÀÌ »ý¼ºµÇÁö 
// ¾Ê¾ÒÀ»¶§ DB ÆÄÀÏÀ» ÃʱâÈ­ ½ÃÄÑÁØ´Ù. 
// DB Æ÷¸äÁ¤º¸(APPNAME)ÀÌ µé¾î°¡°í R_NUM, INC_NUM
// Àº 0À¸·Î ÃʱâÈ­ µÈ´Ù. 
int init_datanum(int fd)
{
    Index_num index_num;
    write(fd, APPNAME, DBINFO_SIZE);
    memset((void *)&index_num, 0x00, INDEX_SIZE);
    write(fd, (void *)&index_num, INDEX_SIZE); 
}

// ·¹Äڵ尡 insert µÇ¾úÀ» °æ¿ì
// R_NUM°ú INC_NUM À» Áõ°¡½ÃŲ´Ù. 
int inc_indexnum(int fd)
{
    int datanum;
    Index_num index_num;
    index_num = get_indexnum(fd);
    index_num.datanum++;
    index_num.incnum++;
    lseek(fd, DBINFO_SIZE, SEEK_SET);
    write(fd, (void *)&index_num, INDEX_SIZE);
    return 1;
}

// ¸ÞÀÎ ¸Þ´º¸¦ Ãâ·ÂÇÑ´Ù. 
void print_main_menu(fd)
{
    Index_num index_num;

    index_num = get_indexnum(fd);
    printf(menu,index_num.datanum);
}

// ¼­ºê¸Þ´º¸¦ Ãâ·ÂÇÑ´Ù. 
void print_menu(char *sub_menu)
{
    printf(sub_menu);
}

// ·¹Äڵ带 »ðÀÔÇÑ´Ù. 
// ·¹ÄÚµå »ðÀÔÀ§Ä¡´Â ÆÄÀÏÀÇ ¸¶Áö¸·ÀÌ´Ù. 
void input_data(Data mydata, int fd)
{
    // ÆÄÀÏÀÇ ¸¶Áö¸·À¸·Î À̵¿ 
    lseek(fd, 0, SEEK_END);
    write(fd, (void *)&mydata, sizeof(Data));
    inc_indexnum(fd);
}

// ·¹ÄÚµå ¸®½ºÆ®¸¦ Ãâ·ÂÇÑ´Ù. 
void print_data(int fd)
{
    int i;
    int offset = 0;
    Data list;
    Index_num index_num;
    index_num = get_indexnum(fd);

    // ·¹ÄÚµåÀÇ ½ÃÀÛÀ§Ä¡·Î À̵¿ÇÑ´Ù. 
    lseek(fd, HEADER_SIZE, SEEK_SET);
    for (i = 0; i < index_num.datanum; )
    {
        read(fd, (void *)&list, sizeof(Data));
        if (list.num > 0) 
        {
            i++;
            printf("%3d %16s %16s\n", list.num, list.name, list.tel_num); 
        }
    }    
}

// ·¹Äڵ带 »èÁ¦ÇÑ´Ù. 
// ½ÇÁ¦·Î µ¥ÀÌŸ¸¦ »èÁ¦ÇÏÁö´Â ¾ÊÀ¸¸ç 
// Data.num ¿¡ (-1)À» °öÇØÁØ´Ù. 
int del_data(int fd,int num)
{
    int offset;
    int del_flag;
    Data list;
    Index_num index_num;

    index_num = get_indexnum(fd);
    printf("delete num is %d\n", num);

    // ÀÔ·ÂµÈ ¹øÈ£°¡ 1 º¸´Ù À۰ųª ·¹ÄÚµå ¼öº¸´Ù Ŭ°æ¿ì
    if ((index_num.incnum-1) > index_num.incnum || num < 1)
        return -1;

    // »èÁ¦ÇϰíÀÚ ÇÏ´Â ·¹ÄÚµåÀÇ À§Ä¡·Î À̵¿ÇÑ´Ù. 
    offset = (sizeof(Data)*(num-1)) + HEADER_SIZE;
    lseek(fd, offset, SEEK_SET);

    read(fd, (void *)&list, sizeof(Data));
    if (list.num < 0) 
    {
        printf("list.num is : %d\n", list.num);
        return -2;
    }

    del_flag = list.num*(-1);    

    // »èÁ¦ÇϰíÀÚ ÇÏ´Â ·¹ÄÚµåÀÇ À§Ä¡·Î À̵¿Çؼ­ 
    // list.num*(-1) °ªÀ» ÀÔ·ÂÇÑ´Ù. 
    lseek(fd, offset, SEEK_SET);
    write(fd, (void *)&(del_flag), sizeof(int));

    // R_NUM À» 1 °¨¼Ò½ÃŲ´Ù. 
    lseek(fd, DBINFO_SIZE, SEEK_SET);
    index_num.datanum--;
    write(fd, (void *)&(index_num), INDEX_SIZE);
    return 1;
}

// ¸Þ´º¼±Åÿ¡ ´ëÇÑ Ã³¸®
void sel_menu(fd)
{
    char menu_num; 
    Index_num index_num;

    // R_NUM°ú INC_NUM À» ±¸Çؿ´Ù. 
    index_num = get_indexnum(fd);

    while(1)
    {
        Data mydata;
        char buf[11];
        char num[11];
        int  state;
        char data[16];

        SCR_CLEAR;            // È­¸é clear    
        MOVE_CURSOR(1,1);     // Ä¿¼­À̵¿
        print_main_menu(fd);  // Main ¸Þ´ºÃâ·Â
        fgets(num, 11, stdin);

        // ÀԷ¹øÈ£¿¡ µû¶ó ºÐ±âÇÑ´Ù. 
        switch(atoi(num))
        {
            // ¸®½ºÆ® Ãâ·Â
            case 1 :
                print_data(fd);
                WAIT_INPUT("Press any key!!");
                break;
            // ÀÔ·Â 
            case 2 :
                SCR_CLEAR;

                MOVE_CURSOR(1,1);
                print_menu(input_menu);

                MOVE_CURSOR(2,12);
                printf("%d", ++index_num.incnum);
                mydata.num = index_num.incnum;

                MOVE_CURSOR(3,12);
                fgets(mydata.name, 16, stdin);
                chop(mydata.name);

                MOVE_CURSOR(4,12);
                fgets(mydata.tel_num, 16, stdin);
                chop(mydata.tel_num);
                input_data(mydata, fd);

                WAIT_INPUT("Press any key!!");
                break;

            // »èÁ¦ 
            case 3 :
                MOVE_CURSOR(10,1);
                printf("»èÁ¦¹øÈ£ ");
                fgets(buf, 11, stdin);
                state = del_data(fd, atoi(buf));
                if (state < 0)
                {
                    printf("À߸øµÈ¹øÈ£ ¼±ÅÃ\n");
                }
                WAIT_INPUT("Press any key!!");
                break;
            case 4 :
                printf("bye bye\n");    
                exit(0);
            default :
                break;
        }
    }
}



int main(int argc, char **argv)
{
    int data_num = 0;
    int is_fileok = 0;
    int fd;
    Data mydata;

    if (argc != 2)
    {
        printf("Usage : ./seek_db dbfile\n");
        exit(0);
    } 

    if ((access(argv[1], F_OK) == 0))
    {
        is_fileok = 1;
    }

    fd = open(argv[1], O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
    if (fd < 0)
    {
        perror("error : ");
        exit(0);
    }
    if (is_fileok == 0)
    {
        printf("FILE INIT\n");
        init_datanum(fd);
    }
    else
    {
        if (dbcheck(fd) != 1)
        {
            fprintf(stderr, "%s ´Â À߸øµÈ DB ÆÄÀÏÀÔ´Ï´Ù\n", argv[1]);  
            exit(0);
        }
    }

    sel_menu(fd);

    close(fd);
    return 1;
}
				


3절. °á·Ð

ÀÌ»ó °£´ÜÇÏ°Ô lseek ¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸°í, lseek ¸¦ »ç¿ëÇÑ ÀÀ¿ë ¾îÇÃÀÇ °³¹ßÀ» ÇØº¸¾Ò´Ù. À§ÀÇ ÀÀ¿ë ¾îÇÃÀÇ °æ¿ì recode »èÁ¦ÈÄ ºñ¾îÀÖ´Â recode °ø°£À» Á¦°ÅÇØÁÖ´Â ±â´ÉÀ» ±¸ÇöÇϰí ÀÖÁö ¾ÊÀºµ¥, º°µµÀÇ ¾îÇø®ÄÉÀ̼ÇÀ¸·Î Çѹø Á¦ÀÛÇØ º¸±â ¹Ù¶õ´Ù. lseek ¸¦ ½áÁÖ°í truncate Á¤µµ¸¸ ½áÁÖ¸é ¾î·ÆÁö ¾Ê°Ô ÀÛ¼ºÇÒ¼ö ÀÖÀ» °ÍÀÌ´Ù.

±×¸®°í ¿©·¯À¯Àú°¡ µ¿½Ã¿¡ »ç¿ë°¡´ÉÇϵµ·Ï ·¹ÄÚµåÀá±ÝµîÀ» ±¸ÇöÇÏ¸é ´õ ±×·²µíÇÑ ¾îÇø®ÄÉÀ̼ÇÀÌ µÉ°ÍÀÌ´Ù.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.