Problém so súborom

Programovacie jazyky, rady, poradňa...
juruces
Amateur
Amateur
Príspevky: 23
Registrovaný: 19 nov 2013, 15:58

Problém so súborom

Príspevok od používateľa juruces »

mám spraviť Na vstupe je textový súbor zdroj.txt s neznámym počtom znakov. v C

načítajte všetky znaky zo súboru do poľa znaky[] a vytvorte z neho reťazec
pomocou funkcie pre prácu s reťazcom nájdite v tomto poli všetky cifry (0 až 9) a uložte ich do nového poľa s názvom cifry[]. Aj toto pole zmeňte na reťazec a vypíšte ho.
pole cifry[] utriedte pomocou algoritmu qsort a zapíšte ho do súboru utriedene.txt
túto úlohu ale asi mám problém s pretečením lebo mi napíše moj počítač ,že prestal pracovať .
Mám napísané toto :

Kód: Vybrať všetko

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "textovy.h"

int main()
{
    FILE *fw;
    char znaky;
    if((fw=fopen("zdroj.txt","w"))==NULL)//otvaranie a testovanie ci sa subor podarilo otvorit
    {
        printf("Neexistuje!");
        return 1;
    }

        if((fw=fopen("utriedenie.txt","w"))==NULL)//otvaranie a testovanie ci sa subor podarilo otvorit
    {
        printf("Neexistuje!");
        return 1;
    }
    znaky=fopen("zdroj.txt","w");

    char * hladaneCifry="123456789";//retazec ktoreho znaky budeme hladat v retazci veta
    char * nasiel;
    int i=0;
    nasiel=strpbrk(znaky,hladaneCifry);
    while(nasiel!=NULL)
    {
        ++i;
        nasiel=strpbrk(++nasiel,hladaneCifry);
    }
    printf("\nCifry so suboru su  %d",i);
    char cifry=i;
    fw=fopen("utriedenie.txt","w");
    putc(cifry, fw);
    fclose(fw);

    return 0;
}
int comp(const void *prvok1,const void *prvok2)
{
    int *prvy=(int *)prvok1;//pretypujeme void * na int*,t.j. na typ ktory porovnavame
    int *druhy=(int *)prvok2;//pretypujeme void * na int*,t.j. na typ ktory porovnavame
    return *prvy-*druhy;

}
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Problém so súborom

Príspevok od používateľa pcsiete »

Zopár vecí by sa tam zišlo zmeniť:
  1. znaky musí byť pointer, teda char*
  2. fopen("zdroj.txt","w") - "w", ale ty nepotrebuješ práva na zápis pri tomto súbore. Čo znamená, že operácia môže zlyhať aj keď súbor existuje, hoci na to nie je dôvod
  3. fopen("utriedenie.txt","w") - rovnako zlyhá väčšinou iba kvôli právam na existujúcom súbore, nie na novom.
  4. znaky=fopen("zdroj.txt","w"); - huh, to je na mňa ťažký kaliber. Potrebuješ skôr:

    Kód: Vybrať všetko

    fw = fopen("zdroj.txt", "r"); //otvor súbor
    fseek(fw, 0, SEEK_END); //posuň kurzor na koniec súboru
    unsigned long int dlzka = (unsigned long int)ftell(fw); //zober pozíciu kurzora, tá je teraz dĺžkou súbora
    
    znaky = (char*)malloc(dlzka+1); //vytvor nové pole pre znaky, pridaj ešte aj miesto na ukončovaciu '\0'
    fseek(fw, 0, SEEK_SET);  //presuň kurzor naspäť na začiatok
    fread(znaky, sizeof(char), (size_t)dlzka, fw); //prečítaj obsah súboru
    znaky[dlzka] = '\0'; //dodaj ukončenie reťazca
    
  5. tvoje vyhľadávanie cifier je dosť neefektívne, nevyužívaš dvojtvarosť znakov (ako znaky a hodnoty v ASCII zároveň). Skús porovnávanie:

    Kód: Vybrať všetko

    if(*ptr>= '\0' && *ptr <= '\9')
        ...
    
juruces
Amateur
Amateur
Príspevky: 23
Registrovaný: 19 nov 2013, 15:58

Re: Problém so súborom

Príspevok od používateľa juruces »

s kurzorom nemám žiadnu skúsenosť a ešte sme ho nepoužívali tak to je problém použiť ho , ale aj tak ˇakujem za pomoc
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Problém so súborom

Príspevok od používateľa pcsiete »

V tom prípade môžeš urobiť čítanie elegantnejším (keď nemáš zadané rozsahy súborov):

Kód: Vybrať všetko

#define BLOCK_SIZE 4096
struct ll_element_struct {
	char * data;
	ll_element_struct * prev, next;
};
typedef ll_element_struct ll_element, *pll_element;

int main() {
	...
	fw = fopen("zdroj.txt", "r");	//otvor súbor
	short blength;
	
	pll_element contents, last;
	contents = curr = calloc(1, sizeof(ll_element_struct));
	while(!feof(fw)) {
		curr->data = (char*)malloc(BLOCK_SIZE);
		blength = fread(data, sizeof(char), (size_t)BLOCK_SIZE, fw);
		if(blength!=BLOCK_SIZE)
			curr->data[blength] = '\0';
		
		curr->next = calloc(1, sizeof(ll_element_struct));
		curr->next->prev = curr;
		curr = curr->next;
	}
	...
}
void print(pll_element contents) {
	if(contents->data==NULL)
		return;
	
	do {
		printf("%s", contents->data);
	} while(contents->next!=NULL);
}
juruces
Amateur
Amateur
Príspevky: 23
Registrovaný: 19 nov 2013, 15:58

Re: Problém so súborom

Príspevok od používateľa juruces »

tak tomu čo si my tu napísal som vobec nepochopil , nič také sme nebrali len základy a z nich máme vytvoriť tento program
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Problém so súborom

Príspevok od používateľa pcsiete »

tak ja vobec neviem čo ste vy brali , pokým nedodáš presnejšie zadanie alebo aspoň predpoklad na čo je táto úloha zameraná, nič iné ti neviem poradiť.
juruces
Amateur
Amateur
Príspevky: 23
Registrovaný: 19 nov 2013, 15:58

Re: Problém so súborom

Príspevok od používateľa juruces »

Na vstupe je textový súbor zdroj.txt s neznámym počtom znakov. v C

načítajte všetky znaky zo súboru do poľa znaky[] a vytvorte z neho reťazec
pomocou funkcie pre prácu s reťazcom nájdite v tomto poli všetky cifry (0 až 9) a uložte ich do nového poľa s názvom cifry[]. Aj toto pole zmeňte na reťazec a vypíšte ho.
pole cifry[] utriedte pomocou algoritmu qsort a zapíšte ho do súboru utriedene.txt
mám zadané toto
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Problém so súborom

Príspevok od používateľa pcsiete »

Toto zadanie nie je o nič presnejšie.
juruces napísal:Na vstupe je textový súbor zdroj.txt s neznámym počtom znakov. v C

načítajte všetky znaky zo súboru do poľa znaky[] a vytvorte z neho reťazec
pomocou funkcie pre prácu s reťazcom nájdite v tomto poli všetky cifry (0 až 9) a uložte ich do nového poľa s názvom cifry[]. Aj toto pole zmeňte na reťazec a vypíšte ho.
pole cifry[] utriedte pomocou algoritmu qsort a zapíšte ho do súboru utriedene.txt
mám zadané toto
Máš neznámy počet znakov (za kompilácie programu) a teda potrebuješ dynamicky vytvoriť toto pole s n prvkami. Problém je, že v čase volania funkcie pre dynamickú alokáciu poľa však potrebuješ, aby bolo n definitívnym číslom. To znamená, že buď zariadiš aby si už vtedy poznal celé n (veľkosť súboru, moje 1. riešenie), alebo aspoň jeho vhodnú časť (teda vytvoríš istú abstrakciu dynamicky rastúcej kolekcie, 2. riešenie je jedným zo spôsobov). Tretí spôsob ma nenapadá.
Napísať odpoveď