| | |
| Stránka: 1 z 1
| [ Príspevkov: 5 ] | |
Autor | Správa |
---|
Registrovaný: 04.07.11 Prihlásený: 13.03.12 Príspevky: 16 Témy: 4 | Napísal v.tkac: 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
|
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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?
|
|
Registrovaný: 04.07.11 Prihlásený: 13.03.12 Príspevky: 16 Témy: 4 | Napísal autor témy v.tkac: 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; }
|
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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.
|
|
Registrovaný: 04.07.11 Prihlásený: 13.03.12 Príspevky: 16 Témy: 4 | Napísal autor témy v.tkac: 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.
|
|
| Stránka: 1 z 1
| [ Príspevkov: 5 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| Nacitanie suboru v Assembler, C, C++, Pascal, Java | 5 | 574 | 23.08.2014 21:35 nasm | | postgresql nacitanie suboru v Databázy | 6 | 576 | 15.08.2012 19:13 zdeniatqo | | nacitanie obsahu suboru v PHP, ASP | 4 | 1012 | 13.02.2009 17:55 _fortes_ | | Nacitanie CSS suboru v PHP, ASP | 12 | 760 | 28.02.2008 20:58 Tominator | | nacitanie suboru s adresaru v Assembler, C, C++, Pascal, Java | 3 | 692 | 25.11.2010 15:00 ado21 | | nacitanie obsahu suboru do premennej v JavaScript, VBScript, Ajax | 9 | 1091 | 05.03.2008 13:45 stenley | | Načítanie kódu HTML z iného súboru v HTML, XHTML, XML, CSS | 11 | 1860 | 23.02.2020 21:58 JanoF | | nacitanie obsahu suboru do pola v C v Assembler, C, C++, Pascal, Java | 5 | 2138 | 28.04.2011 10:39 Fico | | [C]funkcie, nacitanie a porovnanie zo suboru v Assembler, C, C++, Pascal, Java | 6 | 1299 | 31.03.2015 17:47 dany2281995 | | Nacitanie dat z unl/txt suboru do oracle v Databázy | 8 | 1466 | 31.10.2008 20:08 El_locco | | Načítanie php súboru len pre jednu špecifickú url ... v PHP, ASP | 2 | 676 | 11.12.2009 18:22 d0.0b | | wordpress plugin - nacitanie php suboru +include css suborov v Redakčné systémy | 9 | 1489 | 20.03.2014 7:23 don jebot | | [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 | | Efektívne využitie objemu v Assembler, C, C++, Pascal, Java | 3 | 417 | 21.09.2016 8:02 BX | | efektivne riesenie chladenia v PC skrinky, zdroje a všetky druhy chladenia | 15 | 1354 | 21.02.2008 13:12 .:M@Rt!nKo:. | | Efektívne čítanie príkazov - C v Assembler, C, C++, Pascal, Java | 13 | 712 | 28.12.2013 16:06 BX |
| 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
|
|