Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 5 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 04.07.11
Prihlásený: 13.03.12
Príspevky: 16
Témy: 4
Príspevok NapísalOffline : 04.07.2011 11:34

Ahojte
Som začiatočník. Napísal som si program a neviem zistiť chybu.
1) Prečo mi nefunguje funkcia rewind()? Malo by to fungovať. Nevidím nikde chybu.

2) Môžem zistiť počet znakov aj inak ako cykom a prečítaním celého súboru? Napr. z veľkosti textového súboru prepočtom na znaky?
Ušetril by som tým jedno otvorenie a čítanie súboru. Viem že môžem dynamicky vytvárať pole, ale to mi príde neefektívne. Najlepšie sa mi zdá zistiť počet znakov v textovom súbore(s binárnym pracovať nechcem) ešte pred začiatkom čítania.

3) Nieje mi jasné, ako mám načítať znaky zo súboru do jednoznormerného pola_znakov. Skúšal som to pomocou srtcpy(pole_znakov[pocet_riadkov],znak), ale vypisovalo, že súbor znak je typu int, a pole_znakov je char. To je mi je jasné že sa to nevezme, ale neviem, čo s tým.


kod:

Kód:
//vypis obsahu suboru, spocitanie znakov a znovutvorenie
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *f;   // definicia globnej premennej pre odkazovanie na subor

int main(void)
{
  int znak;
  int pocet_znakov=0, pocet_riadkov=0;
  char pole_znakov[151];

   pole_znakov[150]='\n';
 
   f = fopen("c:/subor1.txt", "r");   // otvorenie suboru na citanie
   if (f == NULL) {               // osetrenie - kontrola otvorenia
       printf("Chyba pri otvarani suboru!\n");      
       return -1;
   }
   
   while ((znak = getc(f)) != EOF){      // citanie znak po znaku do konca
       putchar(znak);                  // vypis do konzoly
      pocet_znakov++;
      if (znak =='\n') pocet_riadkov++;   
      
   }
   if (znak==EOF) printf("\nkoniec prveho cyklu\n");
   printf("Subor mal pocet riadkov: %d\n",pocet_riadkov);
   printf("Subor mal pocet znakov: %d\n" ,pocet_znakov);
   pocet_riadkov=0;



   rewind(f);                        //znovuotvorenie

    while ( (znak = getc(f)) == EOF){      //pokus o 2.precitanie
      putchar(znak);
      if (znak =='\n')
      printf("2.nacitanie suboru, spracoval sa riadok: %d\n",pocet_riadkov);
   
/* tu chcem nacitavat znaky do pola pole_znakov ale neviem ako*/
    }

   if (znak==EOF) printf("\nto uz je naozaj koniec\n");

   if ((fclose(f)) == EOF)                     //kontrola zavretia
   printf("Chyba pri zatvoreni souboru!\n");

  return 0;   
}


Ďakujem za radu


Offline

Skúsený užívateľ
Skúsený užívateľ
efektivne nacitanie suboru do pamati v c

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 04.07.2011 17:06

Vitaj :)

1.) funkcia ti funguje, ak spustis program cez debugger, vsimnes si, ze funkcie prebehne uspesne, problem bude skor v podmienke za touto funkciou:
Kód:
while ( (znak = getc(f)) == EOF){      //pokus o 2.precitanie

Zmenit na:
Kód:
while ( (znak = getc(f)) != EOF){      //pokus o 2.precitanie


2.) vseobecne plati, ze velkost suboru = pocet znakov ( jeden znak je velkost bajt a velkost suboru je uvadzana v bajtoch ). Cize zistis to napr aj takto:
Kód:
fseek( f, 0, SEEK_END );
fileSize = ftell( f );
rewind( f );


3.) Nepochopil som velmi otazke. Ak ches ukladat znak, ktory nacitas hned to toho pola, tak jednoducho urobis:
Kód:
pole_znakov[index++] = znak;

Myslel si to takto alebo nejako inak?


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 04.07.11
Prihlásený: 13.03.12
Príspevky: 16
Témy: 4
Príspevok Napísal autor témyOffline : 05.07.2011 13:37

Áno, bola tam v tom == chyba. Nevidel som ju. Programujem v Pelles C, ešte neviem úplne krokovať.

Podarilo sa mi súbor načítať do pamäti, aj mi to vypisuje z pamäti do súboru fw. Ale zle.

V knihe sa píše, že jeden znak je koniec riadku a druhý návrat na ďalší riadok, a program automaticky obstará konce riadkov. Keď sa pozriem do poľa poleZnakov, a potom do súboru f v hexadecimálnom zobrazení, je to tak. Zo súboru do poľa načíta len LF (bez znaku CR). To znamená, že pre výpočet počtu prvkov poľa pre textový súbor platí rovnica:

celkový počet znakov = (počet znakov aj s medzerami) + (počet znakov '\n')

Ale funkcia fputs mi pridáva mi to nejaké ďalšie znaky. Kde tam mám chybu? Ako to má byť, aby mi to urobilo presne tú istú kópiu?

Ak som pole inicializoval nejakým znakom, prekvapilo ma, že funkcia fpust vypísala všetky inicializované znaky z poľa (aj tie čo neboli skopírované zo súboru). Myslel som si, že funkcia bude narábať so znakmi zo súboru.

Tú funkciu fseek som našiel aj v knihe pána Herouta. Rozhodol som sa súbor dvakrát čítať, bude to istejšie.


Kód:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *f,*fw;   // definicia globnej premennej pre odkazovanie na subor
            // pocet prvkov v subore je 20

int main(void)
{
  int znak,i=0;
  int pocetZnakov=0, pocetRiadkov=0;
  char poleZnakov[71];

   poleZnakov[70]='\n';

/*   
   for (i=0;i<61;i++) {   
      printf("%d. pole obsahuje teraz   : %d\n",i, poleZnakov[i]);
      poleZnakov[i]='}';
      printf("%d. pole inicializovane na: %d\n",i, poleZnakov[i]);
   }
   i=0;
*/   
      poleZnakov[70]='\n';   
      printf("%d cislo %d:\n",i, poleZnakov[i]);
      
   

 
   f = fopen("c:/subor1.txt", "r");   // otvorenie suboru na citanie
   if (f == NULL) {               // osetrenie - kontrola otvorenia
       printf("Chyba pri otvarani suboru!\n");     
       return -1;
   }
   
   while ((znak = getc(f)) != EOF){      // citanie znak po znaku do konca
       putchar(znak);                  // vypis do konzoly
      pocetZnakov++;
      if (znak =='\n') pocetRiadkov++;   
     
   }
   if (znak==EOF) printf("\nkoniec prveho cyklu\n");
   printf("Subor mal pocet riadkov: %d\n",pocetRiadkov);
   printf("Subor mal pocet znakov: %d\n" ,pocetZnakov);
   printf("Subor mal znakov a enterov spolu: %d\n" ,pocetRiadkov+pocetZnakov);
   //printf("Subor vsetkych znakov(CR a LF): %d\n" ,pocetRiadkov*2+pocetZnakov);
   pocetRiadkov=0;



   rewind(f);                        //znovuotvorenie

    while ( (znak = getc(f)) != EOF){      //pokus o 2.precitanie
      putchar(znak);
     poleZnakov[i]=znak;
      i++;     
      //if (znak =='\n')
     // printf(" ------- 2.nacitanie suboru, spracoval sa riadok: %d\n",pocetRiadkov++);   
    }
   i=0;

   fw = fopen("c:/subor2.txt", "w");   // otvorenie suboru na zapis
   if (fw == NULL) {               // osetrenie - kontrola otvorenia
       printf("Chyba pri otvarani 2.suboru!\n");     
       return -1;
   }


/*
   for (i=0;i<70;i++) {          //vypis prvkov pola
      printf("%d. pole obsahuje teraz : %d\n",i, poleZnakov[i]);
   }
*/

    fputs (poleZnakov,fw);

   if (znak==EOF) printf("koniec 2\n");

   if ((fclose(f)) == EOF)                     //kontrola zavretia
   printf("Chyba pri zatvoreni souboru pre citanie!\n");

   if ((fclose(fw)) == EOF)                     //kontrola zavretia
   printf("Chyba pri zatvoreni souboru pre zapis!\n");

  return 0;   
}


Offline

Skúsený užívateľ
Skúsený užívateľ
efektivne nacitanie suboru do pamati v c

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 05.07.2011 13:57

Kod som teraz neskusal, iba som ho preletel a chyba bude zrejme tu ( bavime sa o tych znakoch naviac pri funkcii fputs ) - funkcia zapisuje do suboru retazec, ktory sa preda v prvom parametri. Retazec ale MUSI byt ukonceny nulou, ako vo vacsine ostatnych pripadoch pouzitia retazcov v C. Ty ho nikde nulou neukoncujes. Takze oprav to nejako takto:
Kód:
while ( ( znak = getc(f) ) != EOF ) {      //pokus o 2.precitanie
    putchar( znak );
    poleZnakov[i] = znak;
    i++;     
}
    poleZnakov[i] = '\0';        // tento riadok treba pridat
    i=0;

Tymto sa zapisu iba tie znaky z retazca, ktore su pred znakom '\0'. Ako si spominal - ak mas retazec uz nejako inicializovany a ukoncovacia nula by tam nebola, vypisovalo by sa vsetko, az pokial by sa ta nula niekde v pamati nenasla.
Malo by to vyriesit tvoj problem, ak nie, dopis, co to este nerobi ako ma.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 04.07.11
Prihlásený: 13.03.12
Príspevky: 16
Témy: 4
Príspevok Napísal autor témyOffline : 05.07.2011 14:53

Ahoj, dík, ono to fakt funguje. Len nechápem. Problém bol v tom, že v hexadecimálnom súbore bol pred tým každý hexadecimálny znak iný, ale aj tak to zobrazilo písmenka správne (až na ten koniec). Ked tam dám ten znak \0, je zrazu celý súbor tak ako má byť. Ale super. Teraz budem riešiť dynamickú alokáciu poľa, keď už viem koľko má súbor znakov a vypísať ho.


Odpovedať na tému [ Príspevkov: 5 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Nacitanie suboru

v Assembler, C, C++, Pascal, Java

5

574

23.08.2014 21:35

nasm Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. postgresql nacitanie suboru

v Databázy

6

576

15.08.2012 19:13

zdeniatqo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. nacitanie obsahu suboru

v PHP, ASP

4

1012

13.02.2009 17:55

_fortes_ Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Nacitanie CSS suboru

v PHP, ASP

12

760

28.02.2008 20:58

Tominator Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. nacitanie suboru s adresaru

v Assembler, C, C++, Pascal, Java

3

692

25.11.2010 15:00

ado21 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. nacitanie obsahu suboru do premennej

v JavaScript, VBScript, Ajax

9

1091

05.03.2008 13:45

stenley Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Načítanie kódu HTML z iného súboru

v HTML, XHTML, XML, CSS

11

1860

23.02.2020 21:58

JanoF Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. nacitanie obsahu suboru do pola v C

v Assembler, C, C++, Pascal, Java

5

2138

28.04.2011 10:39

Fico Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. [C]funkcie, nacitanie a porovnanie zo suboru

v Assembler, C, C++, Pascal, Java

6

1299

31.03.2015 17:47

dany2281995 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Nacitanie dat z unl/txt suboru do oracle

v Databázy

8

1466

31.10.2008 20:08

El_locco Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Načítanie php súboru len pre jednu špecifickú url ...

v PHP, ASP

2

676

11.12.2009 18:22

d0.0b Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. wordpress plugin - nacitanie php suboru +include css suborov

v Redakčné systémy

9

1489

20.03.2014 7:23

don jebot Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. [C# - Help] Načítanie + vypísanie so súboru text do textbox

v Assembler, C, C++, Pascal, Java

8

860

14.11.2013 15:57

erik518 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Efektívne využitie objemu

v Assembler, C, C++, Pascal, Java

3

417

21.09.2016 8:02

BX Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. efektivne riesenie chladenia

v PC skrinky, zdroje a všetky druhy chladenia

15

1354

21.02.2008 13:12

.:M@Rt!nKo:. Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Efektívne čítanie príkazov - C

v Assembler, C, C++, Pascal, Java

13

712

28.12.2013 16:06

BX Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra