[ krul @ 05.10.2004. 00:25 ] @

Evo buduci da nemam iskustva sa C jezikom odlucih se da se obratim iskusnim
c programerima u nadi da mi ponudite resenje.
Naime problem je jednostavan: moj program treba da uzme od korisnika
serijski broj koji ujedno postaje i ime log fajla.
Buduci da fajl sa unetim serijskim brojem moze vec postojati na lokaciji
na kojoj isti zelim da sacuvam nameravam da proverim dali isti postoji i
ako da, da dodam _ i broj. Sto znaci da mogu da imam x broj fajlova sledeceg
karaktera:
A1245
A1245_1
A1245_2
A1245_3
...

Znaci sistem bi trebao da parsira string odnosno karaktere do underscora ako takav postoji
i da procita zadnji u nizu i doda novi broj.
Znam kako bi to izveo u VB, postoji Rigt funkcija koja mi cita karaktere sa desne strane zadanog stringa, ali koliko vidim u C-u je string prica puno ozbiljnija. U stvari string i ne postoji kao tip podatka. Samo karakter. Nadam se da sam problem jasno izneo.
Isto tako bi bilo dobro ako neko moze da me uputi na teoriju koja jasno obradjuje problematiku stringa u C.
Umalo da zaboravim, ceo kod je unutar "interpreted enviromente" koji poseduje vecinu ali ne i sve
funkcije standardne biblioteke c-a.

Unapred zahvalan.

output = fopen(ffullname,"r");
do
{
if (output != NULL)
{
// Close open file
fclose(output);

if (strstr(fname,"_") != NULL)
{

strcpy(tmp, " Vise od jednog");
gets(tmp);
}
else
{
strcat(fname, "_1");
strcpy(tmp, fname);
gets(tmp);
}

strcpy(ffullname, ARCHIVE);
strcat(ffullname, fname);
//Open file with new name
output = fopen(ffullname,"r");
}
} while (output != NULL);
[ u_m @ 05.10.2004. 01:24 ] @
ja sam jos veci pocetnik od tebe, ali bar da dam neki savjet:

kad gledas da li postoji fajl A1234, i ako postoji, onda idi redom probaj da li postoji A1224_1 ...

i samim tim kad naletis na nepostojeci ljepo ga kreiras i gotovo


[ zvrba @ 05.10.2004. 07:57 ] @
Dakle, da se nastavim na prethodni odgovor. Evo funkcija koja vraca u varijabli name pravo ime, te vraca FILE* na otvoreni fajl za pisanje. name mora biti buffer dovoljno dugacak da se appenda _XX gdje je XX broj.

Code:

FILE *open_log(char *name)
{
  FILE *f;
  int i = 0, len = strlen(name);

  /* da li postoji osnovno ime? */
  if(!(f = fopen(name, "r"))) return fopen(name, "w");

  /* dodaj _XX */
  while(1) {
    sprintf(name+len, "_%d", i);
    if(f = fopen(name, "r")) {
      /* fajl postoji, zatvori ga i i probaj veci broj */
      fclose(f);
      ++i;
    } else {
      return fopen(name, "w");
    }
  }
}

[ krul @ 05.10.2004. 17:29 ] @
To je to zvrba.
Puno hvala.
Pozdrav
[ Dejan Lozanovic @ 05.10.2004. 21:51 ] @
ukoliko imas neka ozbiljnija parsiranja stringova, ja bih ti preporucio da pogledas malo lex + yacc

to su alati koji sluze izmedju ostalog i za pisanje kompajlera, ali mogu da posluze i za neke druge stvari. Lex i yacc generisu C kod koji posle normalno iskompajliras i koristis.

http://www.tldp.org/HOWTO/Lex-YACC-HOWTO.html
[ krul @ 05.10.2004. 22:02 ] @
Dejane, nemam nista ozbiljnije za sad ali bih volio da ovladam sa manipulacijom stringa koristeci c.
U svakom slucaju hvala za link.
[ ljube @ 06.10.2004. 06:40 ] @
Postoji i basic u C kovertor na http://bcx.basicguru.com/

Inace ima rjesenja za sve standardne basic naredbe koje rade sa stringovima. Ako ti vise "lezi" basic, probaj ovo i onda analiziraj generisani C kod.

Inace evo jedan primjer kako BCX prevede naredbu exist, odnosno kada tazi da li postoji fajl ili direktorij

If Exist("c:\temp") Then ....

Code:

BOOL Exist (char *szFilePath)
{
  if(instr(szFilePath,"*")||instr(szFilePath,"?"))
  return Exist_A (szFilePath);
  return Exist_B (szFilePath);
}

BOOL Exist_A (char *szFilePath)
{
  WIN32_FIND_DATA W32FindData;
  HANDLE rc;
  rc = FindFirstFile(szFilePath, &W32FindData);
  if(rc == INVALID_HANDLE_VALUE) return FALSE;
  FindClose(rc);
  return TRUE;
}

BOOL Exist_B (char *szFilePath)
{
  DWORD ret;
  ret = GetFileAttributes(szFilePath);
  if (ret != 0xffffffff) return TRUE;
  return FALSE;
}


Pozdrav,
Ljubisa