Jag och mitt skal: null-filer

Didrik Madheden didrik at kth.se
Thu Jun 28 00:23:45 CEST 2007


On 27/06/07, Alexander Boström <abo at stacken.kth.se> wrote:
> ons 2007-06-27 klockan 22:59 +0200 skrev Didrik Madheden:
> > Finns det något bra sätt att kolla om en fil består enbart
> > null-tecken? Eller till vilken grad en viss fil gör det?
>
> if env LC_ALL=C cmp filen-som-ska-testas /dev/zero 2>&1 | grep -q '^cmp: EOF on '; then
>         echo EOF
> else
>         echo found non-zero
> fi
Där har jag något att ta lärdom av!

> if nåtprogram; then
>         echo gick bra
> else
>         echo gick sönder med $?
> fi
Om man bara vill ha reda på om ett program fallerade kan man även
skriva så här kom jag på:
nåtprogram || echo $?

> Men mitt mail med en lösning som inte involverar C-kompilator ligger och
> dräller i grålistningen...
Dock var det inte ironi när jag sa att ett C-pogam går bra. Nedan
följer vad några minuters vidareutveckling av Pers exempel gav koden
nedan.

#include <stdio.h>

int main (int argc, char *argv[])
{
  int c;
  int totalgroups, nonnullgroups, groupindex,grouphasnonnull;
  while ((c = getchar()) != EOF){


    if (c != '\0')
      grouphasnonnull=-1;

    groupindex = (groupindex+1)%(1024*64);

    if (!groupindex){
      if(grouphasnonnull)
        nonnullgroups++;

      grouphasnonnull=0;
      totalgroups++;
    }
  }
  printf("Null blocks: %d/%d\n", totalgroups-nonnullgroups, totalgroups);

  float ratio=(float)nonnullgroups/(float)totalgroups;

  return (ratio>.10);
}

Meningen är alltså att kolla filen i block om 64k bytes, och räkna hur
många sådana block som bara innehåller null. Om för mycket är null ska
programmet returnera falskt, annars sant.
Har jag gjort några allvarliga misstag? (Förutom överdrivet castande
och att det ev. inte är rätt (tm) att definiera en ny variabel mitt i
koden)

/Didrik Madheden

-----BEGIN 2ROT13 MESSAGE-----
Low Bitrate Netlabel: <http://f-label.tojt.net/>
Blog:
<http://gameboygenius.8bitcollective.com/>
SKRIVA på Lysator. Ditt Ahrvid-fria alternativ:
<http://lists.lysator.liu.se/mailman/listinfo/skriva>
Sätt på ett par flipflops, vippa på rumpan
och gör det här till en minnesvärd sommar!
-----END 2ROT13 MESSAGE-----


More information about the Stacken mailing list