» »

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

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

l0g1t3ch ::

zakaj mi pri 2 opciji se pravi izpisu vseh vnosov na datoteko na koncu vrže še kar en izpis :| pomoje je neki narobi z unim while(!feof) oz ne gre na tak način klicat funkcije. Se mi zdi da sm se mal čudn spisu nalogo:D

prevajalnik, on v dev-c++ nič ne jamra pa tud program se ne sesuje sam na konc mi doda en čudn izpis. Pomoje v zadnji iteraciji pointer pokaže nekam v 3 pm sam nevem kako to rešit.


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

typedef struct
{
	char ime[20];
	char priimek[20];
	char tel[20];
}person;

void vnos();
person* izpis(FILE*);

int main(int argc, char*args[])
{
    person oseba;
	int izbira = atoi(args[1]);
 
	switch(izbira)
	{	
		case 1:
		{
			vnos();
		}break;
		
		case 2:
		{
			FILE *fp1;
			fp1 = fopen("imenik.txt", "r");     	
			do
			{
	            oseba = *izpis(fp1);       
				printf("%s  %s  %s", oseba.ime, oseba.priimek, oseba.tel);
			}while(!feof(fp1));
			fclose(fp1);
		}break;
		
		case 3:
		{
			char tmp[20];
			printf("Vnesite priimek, ki ga zelite poiskati: ");
			scanf("%s", tmp);
			
			FILE *fp1;
			fp1 = fopen("imenik.txt", "r");     	
			do
			{
	            oseba = *izpis(fp1);       
				if(strcmp(oseba.priimek, tmp) == 0)
					printf("%s  %s  %s", oseba.ime, oseba.priimek, oseba.tel);					
			}while(!feof(fp1));
			fclose(fp1);
		}break;
	}
	system("pause");
}

void vnos()
{
	person oseba;
	FILE *fp;
	fp = fopen("imenik.txt", "a");

	printf("Vnesi ime:");
	scanf("%s", &oseba.ime);
	printf("Vnesi priimek:");
	scanf("%s", &oseba.priimek);
	printf("Vnesi telefonsko:");
	scanf("%s", &oseba.tel);
	
	fprintf(fp, "%s|%s|%s\n", oseba.ime, oseba.priimek, oseba.tel);
	fclose(fp);
}

person* izpis(FILE *fp1)
{
	person oseba;
	char temp[60];
	int i=0,st=0;
	
	fgets(temp,60,fp1);
	
	while((temp[st]!='|') && (st<60))
	{
		oseba.ime[i] = temp[st];
		oseba.ime[i+1] = '\0';
		i++; st++;
	}	
	
	i=0; st++;
	while((temp[st]!='|') && (st<60))
	{
		oseba.priimek[i] = temp[st];
		oseba.priimek[i+1] = '\0';
		i++; st++;
	}
	
	i=0; st++;
	while(st<strlen(temp))
	{
		oseba.tel[i] = temp[st];
		oseba.tel[i+1] = '\0';
		i++; st++;
	}
	 person *p = &oseba;
	return p;   
}




Hvala

Gundolf ::

Bi rekel, da imaš srečo da dela, kolikor sploh dela. Ti v funkciji izpis vračaš pointer na lokalno spremenljivko. Ta spremenljivka ni več veljavna, ko greš ven iz funkcije. Pointer ti ne kaže v 3 krasne, ampak na mesto kjer je spremenljivka nekoč bila, a jo je povozila neka kasneje klicana funkcija. Nimam pa pojma zakaj se ti to zgodi le ob koncu fajla. Čisto možno da je še kaka napaka kje.

Zlikovec ::

Poizkusi lokalno spremeljivko, na katero kaže pointer, definirati s static. Njena vrednost ne bo shranjena na stacku, obnašala se bo pa isto.
Ducati Monster, Ducati 750 SS FF, Yamaha XJ6,
Honda Hornet 600, Yamaha Fazer 800, R NineT

l0g1t3ch ::

ja sm poskusu deklarirat satično tisto spremenljivko pa je isto ;((

sam zdele sm pogledu ni problem v vračanju kazalca ampak mi že prej na konec prebere v strukturo tisto sranje.
Na konec metode izpiši sem dal
printf("TEST: %s %s %s\n", oseba2.ime, oseba2.priimek, oseba2.tel);

ki mi izpiše kaj se ob vsakem klicu nahaja v tej strukturi od katere vračam kazalec in ob zadnji iteraciji se v tej strukturi nahajajo oni čudni znaki.

No sm šu pogledat še uno do{}while zanko in sm jo za foro nadomestiv z for zanko, ki se izvede tolkrat kot je vpisov v txt datoteko in zadeva je delovala. Sepravi se potem verjetno uno do{}while zanka izvede 1x preveč :\

Zgodovina sprememb…

  • spremenilo: l0g1t3ch ()

Gundolf ::

Problem je tudi v vračanju kazalca.
Samo bolj očiten problem je očitno ta, da imaš na koncu fajla en new-line. Zato ti eof ne javi da je fajla konec po zadnjem prebranem nizu ampak ti tisto zadnje branje spodleti. Ampak ker po branju ne preverjaš če je bilo vse ok (na temle mestu: fgets(temp,60,fp1);), dobiš smeti. Ena rešitev je, da tam ko bereš preveriš, če je bilo vse v redu, in če ni bilo vrneš NULL. v zanki pa rečeš nekaj v stilu while( (oseba = *izpis(fp1))) != NULL ) {printf...};

l0g1t3ch ::


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

typedef struct
{
	char ime[20];
	char priimek[20];
	char tel[20];
}person;

void vnos();
void izpis(FILE*, person*, int*);

int main(int argc, char*args[])
{
    person oseba;
    person *pos; //kazalec na osebo
    pos = &oseba;
    
    int pogoj = 1;
    int *pog;
    pog = &pogoj;
    
	int izbira = atoi(args[1]);
 
	switch(izbira)
	{	
		case 1:
		{
			vnos();
		}break;
		
		case 2:
		{
			FILE *fp1;
			fp1 = fopen("imenik.txt", "r");     	
			while(pogoj)
			{
	            izpis(fp1, pos, pog);       
				printf("%s  %s  %s", oseba.ime, oseba.priimek, oseba.tel);
//			}while(!feof(fp1)); 
			}

			fclose(fp1);
		}break;
		
		case 3:
		{
			char tmp[20];
			printf("Vnesite priimek, ki ga zelite poiskati: ");
			scanf("%s", tmp);
			
			FILE *fp1;
			fp1 = fopen("imenik.txt", "r");     	
			do
			{
	            izpis(fp1, pos, pog);       
				if(strcmp(oseba.priimek, tmp) == 0)
					printf("%s  %s  %s", oseba.ime, oseba.priimek, oseba.tel);					
			}while(!feof(fp1));
			fclose(fp1);
		}break; 
	}
	system("pause");
}

void vnos()
{
	person oseba;
	FILE *fp;
	fp = fopen("imenik.txt", "a");

	printf("Vnesi ime:");
	scanf("%s", &oseba.ime);
	printf("Vnesi priimek:");
	scanf("%s", &oseba.priimek);
	printf("Vnesi telefonsko:");
	scanf("%s", &oseba.tel);
	
	fprintf(fp, "%s|%s|%s\n", oseba.ime, oseba.priimek, oseba.tel);
	fclose(fp);
}

void izpis(FILE *fp1, person *pos, int *pogoj)
{
	char temp[60];
	int i=0,st=0;
	
	if((fgets(temp,60,fp1)) == NULL)
    {
     *pogoj = 0; 
    }
    else{
                              
	while((temp[st]!='|') && (st<60))
	{
		pos->ime[i] = temp[st];
		pos->ime[i+1] = '\0';
		i++; st++;
	}	
	
	i=0; st++;
	while((temp[st]!='|') && (st<60))
	{
		pos->priimek[i] = temp[st];
		pos->priimek[i+1] = '\0';
		i++; st++;
	}
	
	i=0; st++;
	while(st<strlen(temp))
	{
		pos->tel[i] = temp[st];
		pos->tel[i+1] = '\0';
		i++; st++;
	}
}
}




Zdej mam tko narjen in pomoje kakih vecjih napak z kazalci ni več
samo to me jebe d mi zdaj zadnji vnos 2x izpiše ;(( ;( ;((
kaj ni jasn temu C-ju sovražim C

OwcA ::

Pa uporabljaj kaj drugega.
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

nevone ::

Z while zankami in end_of_file-tom, je pomoje težava v tem, da ti ne dobiš podatka o tem kdaj si na koncu z zadnjim zapisom, ampak je eof zapis zase.

Zato moraš while zanko oblikovati takole:


(pred while zanko obvezno bereš)
izpis(fp1, pos, pog);
while (pogoj)
{
  printf("%s %s %s", oseba.ime,
  izpis(fp1, pos, pog);
(ko bo naletel na eof, bo izvedel izhod iz zanke brez pisanja)
}

o+ nevone
Either we will eat the Space or Space will eat us.

Gundolf ::

Kaj ti zdaj delaš: prebereš in nastaviš pogoj, izpišeš ne glede na vrednost pogoja, potem pa pogledaš pogoj in se odločiš a boš ponovil vajo. Prva napaka je očitna že iz tega postopka, druga je pa ta, da sklepaš da je na začetku pogoj izpolnjen. Teh problemov nimata moja rešitev (ki ti verjetno ni všeč ker je morda prekomplicirana), niti nevone-ina (ki upam da ti bo všeč).

Jaz tudi sovražim C :)

l0g1t3ch ::

Sm naredu tko kot je reku nevone pa dela lepo tak d hvala za pomoč

me pa še neki zanima zakaj pa to ne dela

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

typedef struct
{
	char ime[20];
	char priimek[20];
	char tel[20];
}person;

void vnos();
void izpis(FILE*, person*);

int main(int argc, char*args[])
{
    person oseba;
    person *pos; //kazalec na osebo
    pos = &oseba;
    
    
    
	int izbira = atoi(args[1]);
 
	switch(izbira)
	{	
		case 1:
		{
			vnos();
		}break;
		
		case 2:
		{
			FILE *fp1;
			fp1 = fopen("imenik.txt", "r");   
            izpis(fp1, pos);   	
			do
			{
                printf("%s  %s  %s", oseba.ime, oseba.priimek, oseba.tel);       
	            izpis(fp1, pos);       
			}while(!feof(fp1)); 
			fclose(fp1);
		}break;
	}
	system("pause");
}

void vnos()
{
	person oseba;
	FILE *fp;
	fp = fopen("imenik.txt", "a");

	printf("Vnesi ime:");
	scanf("%s", &oseba.ime);
	printf("Vnesi priimek:");
	scanf("%s", &oseba.priimek);
	printf("Vnesi telefonsko:");
	scanf("%s", &oseba.tel);
	
	fprintf(fp, "%s|%s|%s\n", oseba.ime, oseba.priimek, oseba.tel);
	fclose(fp);
}

void izpis(FILE *fp1, person *pos)
{
	char temp[60];
	int i=0,st=0;
	                              
	while((temp[st]!='|') && (st<60))
	{
		pos->ime[i] = temp[st];
		pos->ime[i+1] = '\0';
		i++; st++;
	}	
	
	i=0; st++;
	while((temp[st]!='|') && (st<60))
	{
		pos->priimek[i] = temp[st];
		pos->priimek[i+1] = '\0';
		i++; st++;
	}
	
	i=0; st++;
	while(st<strlen(temp))
	{
		pos->tel[i] = temp[st];
		pos->tel[i+1] = '\0';
		i++; st++;
	}
}




namesto da bi v while zanki preverju un svoj pogoj sm tist odstanu pa sm namest tega napisu while(!feof(fp1))
sepravi naj bi zadeva delaal do okonca fajla wendar se izkaže da je zanka neskončna.

verjetno zato ker je moja funkcija sedaj po noven void in nic ne vraca sepravi niti ne vrne da je bil dosezen konec datoteke. Ali je kak druga fora ? Čeprav v prvi verzji program ko sm mu narjen preverjanje z tem while(!feof(fp1)) pa je pa delalo. Resda sm v funkciji vračal kazalec na strukturo venda kake veze ma to z datoteko in njenim koncem

Pač zanima me kaj sm ga spet polomu da ne dela ta pogoj da enostavno gledam kdaj pride konec fajla da mi ni treba posebej pogoja delat

nevone ::

Za vsakim branjem iz datoteke mora slediti preverjanje pogoja. Z do while zanko pa ti pred začetkom zanke bereš brez preverjanja pogoja.

Pomoje moraš samo namesto do while uporabiti while pa bo delalo.


izpis(fp1, pos);
while(!feof(fp1))
{
  printf("%s %s %s", oseba.ime, oseba.priimek, oseba.tel);
  izpis(fp1, pos);
}

o+ nevone
Either we will eat the Space or Space will eat us.

nevone ::

Poleg tega si v funkciji izpis pozabil dejansko brati iz datoteke. To ti povzroča neskončno zanko.

o+ nevone
Either we will eat the Space or Space will eat us.

l0g1t3ch ::

opsiii :8)


Vredno ogleda ...

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

C strukture, kazalci naloga pomoc

Oddelek: Programiranje
51469 (1364) DavidJ
»

[C] Branje iz datoteke

Oddelek: Programiranje
101723 (1554) BigWhale
»

[C] Narascajoce sortiranje linearnega seznama

Oddelek: Programiranje
71862 (1751) Jebiveter
»

C problemček

Oddelek: Programiranje
131068 (871) OwcA
»

C++ problem/naloga

Oddelek: Programiranje
7995 (848) Monster

Več podobnih tem