Jednoduchy program v C (was: grep -b nefunguje)

Alexandr Malusek malusek na hroch.ujf.cas.cz
Pondělí Březen 5 22:57:33 CET 2001


lukesh na k-net.cz (Jaroslav Lukesh) writes:

> Program by mel najit pozici textoveho retezce (definovaneho pro
> jednoduchost treba jako konstantu) na zadanem offsetu 1024B bloku dat
> (anebo kdekoliv - je to uplne jedno). Vstupem by byl jakkoliv veliky
> binarni soubor (20GB) a vystupem cislo bloku vzdy na novem radku (+ nejaky
> definovany text) tak, aby se dal vystup presmerovat do souboru a ten
> posleze spustit.

Jednoduchou verzi programu prikladam. Velikost bloku je definovana
konstantou BUFSIZE, retezec je ulozen v poli "pat". Jednotlive
elementy lze zadavat napriklad jako znakove konstanty ('a'), decimalni
konstanty (147) nebo hexadecimalni konstanty (0x01). Velikost pole si
kompilator urci sam pres operator sizeof().

Pouziva se standardni vstup, vystupem je cislo bloku (0, 1, ...)
obsahujici pole pat na offsetu OFFSET. Pocet nactenych bytu "nbr" se
testuje kvuli poslednimu bloku, ktery muze byt nekompletni. Jine
kontrolni testy se kvuli jednoduchosti neprovadeji.

Nijak zvlast jsem to netestoval, mozna jsou tam chyby.

$ cat hdsearch.c
#include <stdio.h>
#include <unistd.h>

#define BUFSIZE 1024
#define OFFSET 8
unsigned char pat[] = {'z','f', 0x01};  /* hledany vzor */
unsigned char buf[BUFSIZE];

int main()
{
  int nbr;
  unsigned long block = 0;

  while ((nbr = read(0, buf, BUFSIZE)) != 0)
    {
      if (!memcmp(buf+OFFSET, pat, sizeof(pat)) && nbr >= OFFSET+sizeof(pat))
	printf("%lu\n", block);
      block++;
    }
  return 0;
}

$ gcc -Wall -O2 hdsearch.c -o hdsearch   # kompilace
# hdsearch < /dev/hda3                   # spusteni

--
A. Malusek  (malusek na ujf.cas.cz)
UJF AV CR


Další informace o konferenci Linux