Wyciąganie łańcuchów znakowych z pliku.

0

Napisałem program do wyciągania łańcuchów znakowych z plików.
Aby zapisać wyniki jego pracy do pliku trzeba napisać w konsoli:
ten_program plik_źródłowy>plik_z_wynikami.txt
Co o nim sądzicie? czy dałoby się to napisać lepiej?
Link do binarki: http://przeklej.org/file/GvYmW2/C.test.exe

 #include <stdio.h>
#define MIN 4
#define MAX 100
char t[MAX];
inline void cls()
{
   int i;
   for(i=0;i<MAX;i++)t[i]='\0';
}
int main(int argc,char **argv)
{
   FILE *plik; register char a; unsigned long long int i,l=0; short x=1;
   if(argv[1]==NULL)
   {
       printf("Nie podano nazwy pliku.\n");
       return 1;
   }
   if((plik=fopen(argv[1],"rb+"))==NULL)
   {
       printf("Nie udalo sie otworzyc pliku %s.\nSprawdz czy na pewno istnieje.\n",argv[1]);
       return 1;
   }
   unsigned long long int size;
   fseek(plik,0,SEEK_END);
   fgetpos(plik,&size);
   fseek(plik,0,0);
   for(i=0;i<size;i++)
   {
       a=fgetc(plik);
       if(a>=' '&&a<='~')
       {
           t[l]=a;
           l++;
           x=1;
       }
       else if(x==1)
       {
           if(l<=MAX&&l>=MIN)
           {
               printf("%s",t);
               printf("\n");
           }
           x=0;
           l=0;
           cls();
       }
   }
   fclose(plik);
   return 0;
}

BTW. W stałych MIN i MAX jest zapisana minimalna i maksymalna długość łańcucha. Domyślny zakres to od 4 do 100.

2

http://linux.die.net/man/1/strings

o twoim kodzie

  1. za dużo kodu w main
  2. czemu akurat: if(a>=' '&&a<='~')?
  3. a co z rożnymi sposobami kodowania?
3

Przydałoby funkcję main podzielić na mniejsze i czytelniejsze bloki, czyli opakować w kilka dodatkowych funkcji; Poza tym napisać go tak, aby nie używał zmiennych globalnych; Ewentualnie dodać kilka pustych linii, dla zwiększenia czytelności.

0
MarekR22 napisał(a):

http://linux.die.net/man/1/strings

o twoim kodzie

  1. za dużo kodu w main
  2. czemu akurat: if(a>=' '&&a<='~')?
  3. a co z rożnymi sposobami kodowania?
  1. Nie miałem pomysłu co jeszcze wrzucić do osobnych funkcji.
  2. Kolega mi podpowiedział.
  3. Nie pomyślałem o tym.
furious programming napisał(a):

Przydałoby funkcję main podzielić na mniejsze i czytelniejsze bloki, czyli opakować w kilka dodatkowych funkcji; Poza tym napisać go tak, aby nie używał zmiennych globalnych; Ewentualnie dodać kilka pustych linii, dla zwiększenia czytelności.

Słyszałem, że nie powinno się używać zmiennych globalnych, jednak z tablicy t[] ma korzystać i funkcja cls() i funkcja main().

2

Zawsze możesz ją przekazać do funkcji cls jako argument, eliminując tym samym konieczność istnienia globalnego obiektu.

1

Czy w tym języku nowe linie i spacje w kodzie to jakiś nietakt?

0

Wróciłem na moment do tego kodu i poprawiłem w nim kilka rzeczy. Wyeliminowałem ryzyko użycia nieprawidłowego indeksu w tablicy, usunąłem zmienną globalną(tablicę) oraz sprawiłem, że program jest znacznie szybszy(poprzednia wersja była o około połowę wolniejsza od tej co wrzucam teraz).

#include <stdio.h>
#define MIN 4
#define MAX 100
inline void cls(unsigned long long end, char t[])
{
    unsigned long long i;
    for(i=0;i<end;i++)t[i]='\0';
}
int main(int argc,char **argv)
{
    char t[MAX]={0};
    FILE *plik; int a; unsigned long long i, index=0; short x=1;
    if(argv[1]==NULL)
    {
        printf("Nie podano nazwy pliku.\n");
        return 1;
    }
    if((plik=fopen(argv[1],"rb+"))==NULL)
    {
        printf("Nie udalo sie otworzyc pliku %s.\nSprawdz czy na pewno istnieje.\n",argv[1]);
        return 1;
    }
    fpos_t size;
    fseek(plik,0,SEEK_END);
    fgetpos(plik,&size);
    fseek(plik,0,0);
    for(i=0;i<size;i++)
    {
        a=fgetc(plik);
        if(a>=' '&&a<='~')
        {
            if(index==MAX) continue;
            t[index]=a;
            ++index;
            x=1;
        }
        else if(x==1)
        {
            if(index>=MIN) printf("%s\n",t);
            cls(index, t);
            x=0;
            index=0;
        }
    }
    fclose(plik);
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1