Archief - [PROG][C] Eof

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Mr. Icecube

Legacy Member
Ik moet voor school een programma schrijven waarin ik koppels van 2 getallen moet lezen en deze dan in een tekstbestand moet wegschrijven.
Op zich niet zo moeilijk. Maar het probleem is dat ik de invoer van de getallen moet stoppen bij invoer van CTRL+Z. Hij moet dus ook direct stoppen hierna en dus niet nog naar het 2e getal vragen.

Code:
#include <stdio.h>
#define LIJST "lijst.txt"

void main(void)
{
	FILE *flp;
	double x=1,y;

	flp=fopen(LIJST,"w+");
	
	printf("Geef een reeks van 2 meetresultaten x en y:\n");
	
	while(x!=EOF)
	{
		printf("x=");
		scanf("%lf%*c", &x);
		
		printf("y=");
		scanf("%lf%*c",  &y);
		fprintf(flp, "%f %f\n", x, y);
	}
	
	fclose(flp);
}

als ik dit run en Ctrl+z ingeef, dan begint het programma heel de tijd terug de lus af te lopen zonder te wachten op een invoer door mij. dat geeft het volgende zeer mooie resultaat :P :

x=y=x=y=x=y=x=y=x=y=x=y=...

The Crazy Frog

Legacy Member
Probeer eens do{ }while() in plaats van while(){}.
Kheb het niet getest, maar ik vermoed dat uw probleem daar zit.

Mr. Icecube

Legacy Member
ik heb het voorlopig zo opgelost:

Code:
while(1)
	{
		printf("x=");
		if(scanf("%lf%*c", &x)==EOF)
		{
			break;
		}
		else
		{
		printf("y=");
		scanf("%lf%*c",  &y);
		fprintf(flp, "%f %f\n", x, y);
		}
	}

Mr. Icecube

Legacy Member
ok nu zit ik met een ander probleem. ik moet uiteraard verder iets met die getallen doen.

ik moet deze getallen terug lezen uit het tekstbestand en er dan wat berekeningen met doen. dit leek mij op het 1e zicht niet echt een probleem.
maar ik wou toch eens proberen of het lezen van de getallen wel zou lukken.
dus ik las ze altijd met fscanf() en dan schreef ik ze op mijn scherm met printf(). het enige probleem is nu dat mijn programma de getallen niet leest.

als ik in het begin van mijn programma 1,2,3 en 4 intyp, dan worden deze
in de vorm:
1.000000 2.000000
3.000000 4.000000
in het bestand geschreven. maar als ik ze terug lees, dan krijg ik als resultaat:
0.000000 0.000000
0.000000 0.000000

Code:
	double x[n], y[n];
	
	for(i=0;i<=n-1;i++)
	{
		fscanf(flp, "%lf%*c%lf%*c", &x[i], &y[i]);
		printf("%f %f\n", x[i], y[i]);
	}

wat is er hier fout aan?

killgore

Legacy Member
@1e vraag:
Logisch nadenken?
fscanf zet nooit die EOF in uw x, hij geeft EOF enkel terug.
Ook snap ik uw gehele print gedoe daar niet, eerst schrijf je naar scherm x=, maar je zet daar niets meer achter, want uw volgende print is naar een file.

Uw 2e: dat kan toch gewoon al niet :wtf:. Arrays declareren met een variabele grote n :eek:.
En moet die fscanf niet gewoon dit zijn?
fscanf(flp, "%lf %lf\n", &x, &y);

Darth-Falcon

Legacy Member
als ik mij niet vergis moet ge op het einde eerst nog '\n' wegschrijven //nvm dat gebeurt.

werk anders eens met floats, ik geloof niet dat doubles voor komma getallen dienen.

@ Killgore, ge kunt dat weldegelijk doen ze, eerst constante declareren en daarme arrays declareren.

Mr. Icecube

Legacy Member
@killgore:
over die array met grootte n, ik heb die n ondertss well een waarde gegeven. ik zal voor alle duidelijkheid even heel het programma geven:

Code:
#include <stdio.h>
#define LIJST "lijst.txt"

int lees(FILE *flp);

void main(void)
{
	FILE *flp;
	int n,i;
	
	flp=fopen(LIJST,"r+");
	
	n=lees(flp);
	
	double x[n], y[n];
	
	for(i=0;i<=n-1;i++)
	{
		fscanf(flp, "%lf% %lf\n", &x[i], &y[i]);
		printf("%f %f\n", x[i], y[i]);
	}
	
	fclose(flp);
}
	
int lees(FILE *flp)
{
	double x,y;
	int tel=0;

	printf("Geef een reeks van 2 meetresultaten x en y:\n");	
	while(1)
	{
		printf("x=");
		if(scanf("%lf%*c", &x)==EOF)
		{
			break;
		}
		else
		{
		printf("y=");
		scanf("%lf%*c",  &y);
		fprintf(flp, "%f %f\n", x, y);
		tel++;
		}
	}
	return tel;
}

ik hoop dat het nu wat duidelijker is

Darth-Falcon

Legacy Member
doe in uw fscanf regel in main die \n is weg

der zit iets fundamenteel nie juist ze, ge programmeert nogal raar imo

uw fout is:

ge schrijft alles weg in de file en ge laat die file open staan om er direct terug uit te lezen, maar ge staat nog op het einde van die file.
daarom vind hem geen waarden

sluit de file na wegschrijven en opent hem bij het lezen opnieuw.

Darth-Falcon

Legacy Member
nog een fout: ge opent de file om te lezen, niet om te schrijven

als ge waardes wilt inlezen en wegschrijven
flp=fopen(LIJST,"w+");

waardes uit file lezen
flp=fopen(LIJST,"r+");

Darth-Falcon

Legacy Member
Code:
#include <stdio.h>
#define LIJST "lijst.txt"

int lees();

void main(void)
{
	FILE *flp;
	int n,i;
	float x, y;


	n=lees();


	flp=fopen(LIJST,"r+");
	for(i=0;i<=n-1;i++)
	{
		fscanf(flp, "%f %f", &x, &y);
		printf("\nx= %f y= %f\n", x, y);
	}

	fclose(flp);
}

int lees()
{
		  FILE *flp;
	float x, y;
	int tel=0;
		  flp=fopen(LIJST,"w+");

	printf("Geef een reeks van 2 meetresultaten x en y:\n");
	while(1)
	{
		printf("x=");
		if(scanf("%f", &x)==EOF)
		{
			fclose(flp);
			break;
		}
		else
		{
		printf("y=");
		scanf("%f",  &y);
		fprintf(flp, "%f %f\n", x, y);
		tel++;
		}
	}
		  fclose(flp);
	return tel;
}

astublieft, rekening komt nog.

Mr. Icecube

Legacy Member
ja dit klopt zeker. alleen had ik x en y er met een reden als arrays ingezet. het moest namelijk in arrays gestockeerd worden.

Darth-Falcon

Legacy Member
ja dan moete da ff terug aanpassen he :p

heb het ff zo gedaan omdat ik met oude compiler werk, en daar kunde arrays nie op die manier declareren, alleen met constante

Mr. Icecube

Legacy Member
aha ok bedankt. het werkt nu.

en het enigste wat gij dus gedaan hebt is in de functie lees() de flp op "w+" gezet en in de main() de flp op "r+" gezet? of zie ik iets over het hoofd?

Darth-Falcon

Legacy Member
uw variable type op float gezet en \n weggedaan in fscanf lijn in main()

en ik open de file 1 keer voor het schrijven en 1 keer voor het lezen

Mr. Icecube

Legacy Member
ok bedankt voor de hulp.
dat bespaart mij weer een hele tijd zoeken en proberen :)

killgore

Legacy Member
Darth-Falcon zei:
@ Killgore, ge kunt dat weldegelijk doen ze, eerst constante declareren en daarme arrays declareren.
Welke persoon declareert dan ook constanten met een KLEINE letter :p?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan