Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Ucitavanje file-a u string

[es] :: C/C++ programiranje :: Ucitavanje file-a u string

[ Pregleda: 2910 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Chorlya

Član broj: 4543
Poruke: 29
*.200.EUnet.yu



+1 Profil

icon Ucitavanje file-a u string23.07.2003. u 02:03 - pre 229 meseci
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;
}

 
Odgovor na temu

Marko Stankovic

Član broj: 11
Poruke: 306
*.ptt.yu



Profil

icon Re: Ucitavanje file-a u string23.07.2003. u 02:35 - pre 229 meseci
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);

...


I drink to make other people interesting.
 
Odgovor na temu

bzero
dev null
europe

Član broj: 5907
Poruke: 371
62.108.125.*

Jabber: bzero@elitesecurity.org
Sajt: www.google.com/search?q=b..


Profil

icon Re: Ucitavanje file-a u string23.07.2003. u 12:46 - pre 229 meseci
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")).
Never trust an operating system you don't have sources for.
 
Odgovor na temu

Chorlya

Član broj: 4543
Poruke: 29
*.252.EUnet.yu



+1 Profil

icon Re: Ucitavanje file-a u string23.07.2003. u 12:48 - pre 229 meseci
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?
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Ucitavanje file-a u string23.07.2003. u 13:22 - pre 229 meseci
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.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

BATE

Član broj: 4159
Poruke: 24
195.66.182.*



Profil

icon Re: Ucitavanje file-a u string23.07.2003. u 15:02 - pre 229 meseci
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.
 
Odgovor na temu

Chorlya

Član broj: 4543
Poruke: 29
*.165.EUnet.yu



+1 Profil

icon Re: Ucitavanje file-a u string23.07.2003. u 18:09 - pre 229 meseci
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
 
Odgovor na temu

[es] :: C/C++ programiranje :: Ucitavanje file-a u string

[ Pregleda: 2910 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.