[ Chorlya @ 23.07.2003. 02:03 ] @
Imam problem pri ucitavanju binarnog file-a u string.
Dole je kompletan kod sa komentarima a kompajler je mingw.

Code:


#include <stdio.h>
#include <string.h>

int main(){
  char *inFileName;
  int c;
  long fileSize, count;
  FILE *in;

  if( (inFileName = (char *)malloc(255)) == NULL){
    printf("\nGreska!!!\nNema dovoljno memorije za inFileName");
    return 1;
  }
  printf("\nUnesite ime file-a(sa putanjom): ");
  gets(inFileName);
  fflush(stdin);
  
  if( (in = fopen(inFileName, "rb")) == NULL ){
    printf("\nGreska pri otvaranju file-a %s\nPrekidam...", inFileName);
    return 1;
  }
  
  fseek(in, 0, SEEK_END);
  fileSize = ftell(in);
  fseek(in, 0, SEEK_SET);
  
  char inStr[fileSize+1];
  
  count = 0;
  while((c = getc(in)) != EOF){
    inStr[count++] = c;
    /* ovde nastaju problemi jer bez obzira na fajl 
        inStr je uvek isti, a broj prolazaka kroz petlju je OK
        Probao sam i ovo
        num = fread(inStr, sizeof(char), fileSize, in);
        num vrati broj bajtova u fajlu ali je inStr 
        opet isti kao i sa getc
    */
  }
  fclose(in);
  
  printf("\nfileSize = %d\ncount = %d", fileSize, count);
  printf("\nstrlen(inStr) = %d", strlen(inStr)); //uvek je 4
  printf("\n%s", inStr); //uvek stampa ovo: " ě Ó" 
  
  return 0;
}

[ Marko Stankovic @ 23.07.2003. 02:35 ] @
Koliko sam ja mogao da primetim nisi stavio '\0' karakter na kraju niza inStr, tako da se prilikom ispisa tog stringa ispisuju i slucajne vrednosti koje su se zatekle u memoriji. Jer prilikom %s izlazne konverzije ispisuje se sve do nul karaktera, odnosno '\0', pocevsi od date adrese. A cini mi se i da f-ja strlen() radi na isti nacin, odnosno broji sve dok ne naidje na nul karakter, pa je verovatno zbog toga cudan rezultat.
Probaj ovo pa javi.

Znaci mozes da uradis nesto ovako:

Code:

...

while((c = getc(in)) != EOF){
    inStr[count++] = c;


  };
  inStr[count]='\0';
  fclose(in);

...

[ bzero @ 23.07.2003. 12:46 ] @
Problem je sto koristis C string funkcije kao sto je strlen.
String je niz karaktera koji se zavrsava null bajtom (\0). Ti u while petlji ucitas ceo sadrzaj fajla u memoriju, ali tvoj fajl je binarni sadrzi i null bajtove, pa ce strlen dati samo duzinu do prvog '\0' (isto vazi i za printf("%s")).
[ Chorlya @ 23.07.2003. 12:48 ] @
Probao sam da dodam '\0' na kraj stringa ali opet isto, a isto je jer je 5 karakter u nizu '\0' kao i jos gomila karaktera posle njega. Probaj ovo sa nekim binarnim (.jpg) fajlom pa vidi koliko NULL karaktera ima u tom fajlu.
Code:

  .....

  count = 0;
  while((c = getc(in)) != EOF){
    inStr[count++] = c;
    if(c=='\0') printf("\n c == '\\o' (%d)", count);
  }
  inStr[count]='\0';
  fclose(in);
  
  ......

Znaci stoji da %s stampa do prvog '\0' kao i za strlen() ali kako to zaobici? Kako da ucitam binarni fajl koji u sebi sadrzi '\0' karaktere u string koji bi mogao da prosledim f-ji koja ce da ga pripremi za upis u bazu?
[ leka @ 23.07.2003. 13:22 ] @
Binarni fajl drzati u stringu, pogotovo C stringu nema smisla, jer negde u tom fajlu kad-tad mora da se pojavi \0 , sto kao sto znamo predstavlja kraj stringa. Ti mozes da prodjes kroz fajl upises bajtove u memoriju, ali C ce interno "kapirati" samo deo stringa do prve pojave \0 . Ako je vec rec o binarnom fajlu, moras da dopises i ispitivanje da li si negde u fajlu procitao \0, ako jesi, zameni ga sa nekim drugim karakterom, ili grupom karaktera, pa onda kasnije to moras da "vratis" na svoje mesto kad ponovo budes hteo da pises fajl...

Predlazem da binarne fajlove ucitavas u najprostiji uint8 (recimo) niz iste velicine koliko je velik fajl.
[ BATE @ 23.07.2003. 15:02 ] @
Binarne podatke kao sto leka kaze ti je najbolje drzat u uint8 ili u char ali da ga ne citas kao string. Izmjeri velicinu fajla (imas funkcije za to) i alociraj char niz potrebne memorije. Upisi sadrzaj binarnog fajla u ovaj niz i poslje nemoj raditi
Code:
printf("%s", bin_str);
nego prodji kroz cijeli niz i radi
Code:
printf("%c", bin_str[pozicija]);
mada ti ne preporucujem da binarni fajl ispisujes na ekran :) vidjet ces i zasto.
[ Chorlya @ 23.07.2003. 18:09 ] @
Da slazem se da je glupo drzati binarni fajl u stringu ali je to ipak neophodno, bar na kratko, kako bi ga prosledio funkciji koja ce da zameni sve \0 i ' karaktere kako bi mogao taj string da koristim u INSERT ili UPDATE statement-u pri radu sa bazom.
Druga opcija je, kao sto leka rece, da ta funkcija u while petlji koja cita fajl zamenjuje te karaktere ali mi se prva opcija ucinila brzom jer f-ja za to dolazi sa API-jem za bazu.
U svakom slucaju problem je resen tako sto sam izbacio one(glupe i nepotrebne) testove tipa strlen(bin_str) i printf("%s", bin_str) i samo prosledio pointer na string i duzinu stringa f-ji. U konkretnom slucaju to bi bilo inStr i count.
Ta f-ja cita count bajtova u memoriji pocevsi od onog na koji pokazuje inStr i proverava da li su \0 ili ' i ako jesu...
Izgleda da sam konacno skontao o cemu se radi : )
Zahvaljujem svima na pomoci.

Pozdrav