» »

[C] Branje iz datoteke

[C] Branje iz datoteke

Robocop1 ::

Že cel dan se ukvarjam z eno nalogo. Sicer vem, da sem jo pravilno naredil, pa ne vem zakaj ne dela.
Torej stvar je taka: Napisati moram program v C-ju, ki bo v zanki bral iz datoteke, pa ne iz ene datoteke ampak iz treh. Vsakič, ko se zanka ponovi, program prebere niz iz datoteke (najprej iz. prve, potem iz druge in iz tretje) in ga shrani v tabelo nizov. Če berem iz 1. datoteke, se niz shrani v 1. tabelo, sicer v 2. oz. v 3.
Branje iz datoteke se ustavi, ko program naleti na prazno vrstico oz. EOF.

Vesel bi bil, če bi mi kdo napisal ta program in ga preveril, ker jaz pri svojem programu ne najdem napake (mi je tudi ne javi med prevajanjem), vendar program ne dela.

Robocop1 ::

char *podatek1[100], *podatek2[100];

int i=0;
FILE *datoteka1;
datoteka1 = fopen("datoteka1.txt", "r");
fgets(podatek1[i], 50, datoteka1);
fclose(datoteka1);
printf("%s\n", podatek1[i]);

FILE datoteka2;
datoteka2 = fopen("datoteka2.txt", "r");
fgets(podatek2[i], 50, datoteka2);
fclose(datoteka2);
printf("%s\n", podatek2[i]);

A lahko kdo vsaj pove, kje je tukaj napaka, če predpostavimo,
da obe datoteki že obstajata in sta napolnjeni z besedilom.

OmegaM ::

Naloge ti kar tak verjetno ne bo sel nihce sel resevat, ceprav je ta izi.

Ze za namig ...
Datoteko zapres na koncu

Nikjer ni videti da bi se sploh sprehajal po datoteki, torej, recimo kje je while zanka, pa ce hoces imet za preverjanje si lepo se nek IF staven prej, torej ...

recimo vrstni red:

FILE *datoteka1;

char podatek1[100];
char podatek2[100];

datoteka1 = fopen("datoteka1.txt", "r");

//tu naredis nek IF za to ce je datoteka sploh tu, oz. ce jo lahko odpre

pol else noter, pa while zanko dokler, kot si sam rekel ne pride do konca ( EOF oz. feof )

znotraj tega while pa
fgets(podatek1[i], 50, datoteka1); ...

itd ...
Pa imas skoraj reseno ;)
Ni nam lahko, bo pa boljše!!!

fiction ::

Ok, recimo da error checkinga namenoma ni v kodi, da je bolj pregledno in da je "FILE datoteka2" namesto "FILE *datoteka2" typo.

"char *podatek1[100]" je verjetno "char podatek1[100]" ali hoces res imeti array 100 stringov (char pointerjev)? Fora pri tem je, da char *s sam po sebi se ne mores uporabljati da bi tja nekam napisal. s je samo en pointer, ki ni inicializiran. Inicializirati bi ga moral, da bi kazal na neko veljavno lokacijo, recimo s = malloc()... ali pa mogoce lazje ce naredis 2D array v primeru ce to res hoces.

Ce naredis "char podatek1[100]" potem mora tudi "fgets(podatek1[i], 50, datoteka1)" biti "fgets(podatek1, 50, datoteka1)".

OmegaM ::

Po moje je nekje prepisoval pa zato spregledal glede za kazalec, drugace pa ga sploh ne rabi/s

Zato sem mu dal brez kazalcev zgoraj namig.
Ni nam lahko, bo pa boljše!!!

ania ::

Predvidevam, da nisem edina, ki ima tezavo z dn na FRI. Skratka, moramo brati iz treh datotek (v prvi startna stevilka in ime, v drugi prva voznja in rezultati, v tretji tretja voznja). Do sedaj imam:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
	FILE *smucarji, *serija1, *serija2;
	char ime[50], rezultat1[100], rezultat2[100];
	char *imena[100], *rezultat11[100], *rezultat22[100];
	int index, index1, index2;

	if((smucarji=fopen("smucarji.txt", "r"))==NULL){
		printf("Tezave pri odpiranju datoteke.\n");
		exit(2);	
	}
	if((serija1=fopen("serija1.txt", "r"))==NULL){
		printf("Tezave pri odpiranju datoteke.\n");
		exit(3);	
	}
	if((serija2=fopen("serija2.txt", "r"))==NULL){
		printf("Tezave pri odpiranju datoteke.\n");
		exit(3);	
	}
	
	while(!feof(smucarji)){
		fscanf(smucarji, "%d", &index);
		fgets(ime, 50, smucarji);
		imena[index - 1] = ime;
		printf("%d %s", index, ime);
	}
	printf("\n\n");
	while(!feof(serija1)){
		fscanf(serija1, "%d", &index1);
		fgets(rezultat1, 100, serija1);
		rezultat11[index1 - 1] = rezultat1;
		printf("%d %s", index1, rezultat1);
	}
	printf("\n\n");
	while(!feof(serija2)){
		fscanf(serija2, "%d", &index2);
		fgets(rezultat2, 100, serija2);
		rezultat22[index2 - 1] = rezultat2;
		printf("%d %s", index2, rezultat2);
	}
	printf("\n\n");

	for(int i = 1; i < index; i++){
		int rezultat[100];
		rezultat[i] = rezultat11[i] + rezultat22[i];
		printf("\n%s", rezultat[i]);
	}
	fclose(smucarji);
	fclose(serija1);
	fclose(serija2);	
	return 0;
}

Nimam pojma kako naj naredim tabelo za rezultate, ki bo delovala. Fora v tem, da moram sesteti rezultate z enakim indexom. Nasvet, namig? Brez idej.. Cisto. Mi pa zmanjkuje casa. Torej hvala vsem za pomoc!

BigWhale ::

Predvidevam, da nisem edina, ki ima tezavo z dn na FRI. Skratka, moramo brati iz treh datotek (v prvi startna stevilka in ime, v drugi prva voznja in rezultati, v tretji tretja voznja). Do sedaj imam:


Torej lepo po vrsti, zacnimo na koncu,... ;)

Nimam pojma kako naj naredim tabelo za rezultate, ki bo delovala. Fora v tem, da moram sesteti rezultate z enakim indexom. Nasvet, namig? Brez idej.. Cisto. Mi pa zmanjkuje casa. Torej hvala vsem za pomoc!


Se pravi imas tri datoteke in v njej smucarje in dva rezultata. Fino. Katerih rezultate moras sesteti. Delali bomo precej osnovnosolsko, grobo in predvsem grdo. :>

FILE *smucarji, *serija1, *serija2;
char names[100][50];
int  results1[100], results2[100];
int i, cnt;


Najprej definiramo vse spremenljivke. Potrebujemo eno tabelo za imena in dve tabeli za rezultate. Za domaco nalogo cam prepustim idejo, kako vse skupaj zdruziti v eno samo malo vecjo tabelo. Prav?

Potem odpremo vse tri datoteke.
        if ((smucarji = fopen("a.txt", "r")) == NULL) {
                exit(2);
        }
        if ((serija1 = fopen("1.txt", "r")) == NULL ) {
                exit(3);
        }
        if((serija2=fopen("2.txt", "r"))==NULL){
                exit(3);        
        }

Predvidevamo, da v vsaki datoteki ena vrstica pomeni en podatek. Torej podatke preberemo. Potrebujemo samo en klic, fgets() ali pa fscanf(). V tem primeru je slednji verjetno bolj uporaben. Najprej preberemo imena. Da se prevajalnik ne bi razburjal ga pri klicu fscanf() funkcije prelisicimo z enim zlobnim castom...

i = 0;
while(!feof(smucarji)) {
    fscanf(smucarji, "%s\n", (char *)names[i]);
    i++;
}


Uspesno smo prebrali imena smucarjev, sedaj pa se rezultate, dvakrat na isti nacin:

i = 0;
while(!feof(serija1)) {
    fscanf(serija1, "%d\n", &results1[i]);
    i++;
}


Na koncu samo se izpisemo imena in sestejemo case prve in druge voznje, vse skupaj v borih treh vrsticah kode! Magic you say??

    for(cnt = 0; cnt < i; cnt++ ) {
        printf("Ime: %s, rezultat: %d\n", names[cnt], results1[cnt] + results2[cnt]);
    }


Icing on the cake je pa zapiranje datotek in vracanje nicle! Vsaj nekaj so vas naucili!
fclose(smucarji);
fclose(serija1);
fclose(serija2);
return 0;


Evo, vse to samo zato, ker si zenska. :>

Zgodovina sprememb…

  • spremenil: BigWhale ()

Ktj ::

int results1[100], results2[100];


Ti pa bl mal smučanje gledaš ^^. Jest bi dau float namesto int gledenato kakšni so rezultati pr smučanju. Je pa res da je odvisno od načina kako je zapisano.

BigWhale ::

Hm, tle gre za koncept, ne pa za recept. Tolk so pa ze brihtni, da bodo to pogruntal, a ne?

Zgodovina sprememb…

  • spremenil: BigWhale ()

Tutankhamun ::

BigWhale, prov pogledu sm če je ženska pa piše da je moški :).
AMD Phenom QUAD 9950 Black Edition, 8GB

BigWhale ::

Sej v resnici itak ne vem. :> Tud ce bi tam pisal da je.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c] Enaki datoteki

Oddelek: Programiranje
7948 (808) Spura
»

C strukture, kazalci naloga pomoc

Oddelek: Programiranje
51396 (1291) DavidJ
»

[C++][Naloga] Tekstovne datoteke, realna števila

Oddelek: Programiranje
253890 (3506) Gundolf
»

[C] čuden izpis iz txt dat. na zaslon

Oddelek: Programiranje
121625 (1362) l0g1t3ch
»

kazalci, funkcije ipd...

Oddelek: Programiranje
71245 (1176) OwcA

Več podobnih tem