Ficheros y vectores

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
Anon
Mensajes: 15
Registrado: 07/03/2013 12:00 pm

Ficheros y vectores

#1 Mensaje por Anon » 28/05/2013 5:24 am

En el siguiente ejercicio, este código me funciona:

Código: Seleccionar todo

// Un archivo contiene enteros positivos y negativos. Utilice la función fscanf ()
// para leer el archivo y determinar el número de enteros negativos

#include <stdio.h>
#define N 5 // Máximo de números a introducir

void entrada (int num[], FILE *f);

int main()
{
	FILE *f;
	int i, cont2=0;
	int num[N];
	entrada (num, f);
	f = fopen ("archivo.txt", "r");
	i=0;
	while (!feof(f))
	{
		fscanf (f, "%i ", &num[i]);
		//printf ("%i ", num[i]);
		if (num[i]<0) cont2++;
		i++;
	}
	fclose (f);
	printf ("\nPulsa ENTER para continuar . . .\n");
	getchar();
	getchar();
	printf ("El número de negativos es de %i\n\n", cont2);
	return 0;
}

void entrada (int num[], FILE *f)
{
	char op;
	int i;
	f = fopen ("archivo.txt", "w");
	for (i=0; i<N; i++)
	{
		printf ("Introduce número:\n");
		scanf ("%i", &num[i]);
		fprintf (f, "%i ", num[i]);
	}
	fclose (f);
}
En cambio, al poner este otro, no:

Código: Seleccionar todo

// Un archivo contiene enteros positivos y negativos. Utilice la función fscanf ()
// para leer el archivo y determinar el número de enteros negativos

#include <stdio.h>
#define N 5 // Máximo de números a introducir

void entrada (int *cont, int num[], FILE *f);

int main()
{
	FILE *f;
	int i, cont=0, cont2=0;
	int num[N];
	entrada (&cont, num, f);
	f = fopen ("archivo.txt", "r");
	i=0;
	while (!feof(f))
	{
		fscanf (f, "%i ", &num[i]);
		//printf ("%i ", num[i]);
		if (num[i]<0) cont2++;
		i++;
	}
	fclose (f);
	printf ("\nPulsa ENTER para continuar . . .\n");
	getchar();
	getchar();
	//system("clear");
	printf ("El número de negativos es de %i\n\n", cont2);
	return 0;
}

void entrada (int *cont, int num[], FILE *f)
{
	char op;
	int i;
	f = fopen ("archivo.txt", "w");
	for (i=0; i<N; i++)
	{
		printf ("Introduce número:\n");
		scanf ("%i", &num[i]);
		fprintf (f, "%i ", num[i]);
		cont++;
		printf ("Desea introducir otro número?[s/n]\n");
		getchar();
		scanf ("%c", &op);
		if ((op=='s')||(op=='S'))
		{
			continue;
		}
		else
		{
			return;
		}
	}
	fclose (f);
}
Lo que me hace éste último código es contarme sólo el primer valor que introduzco. Sin embargo, miro el fichero, y esta con todos los valores introducidos en la ejecución del programa. ¿Porque sucede esto? Agradecería mucho vuestra ayuda.

Saludos.

Anon
Mensajes: 15
Registrado: 07/03/2013 12:00 pm

#2 Mensaje por Anon » 28/05/2013 6:28 am

Código: Seleccionar todo

// Un archivo contiene enteros positivos y negativos. Utilice la función fscanf ()
// para leer el archivo y determinar el número de enteros negativos

#include <stdio.h>
#define N 5 // Máximo de números a introducir

void entrada (int *cont, int num[]);
void cargar_fichero (int cont, int num[]);

int main()
{
	FILE *f;
	int i, cont=0, cont2=0;
	int num[N];
	entrada (&cont, num);
	cargar_fichero (cont, num);
	f = fopen ("archivo.txt", "r");
	i=0;
	while (!feof(f))
	{
		fscanf (f, "%i\n", &num[i]);
		//printf ("%i ", num[i]);
		if (num[i]<0) cont2++;
		i++;
	}
	fclose (f);
	printf ("\nPulsa ENTER para continuar . . .\n");
	getchar();
	getchar();
	//system("clear");
	printf ("El número de negativos es de %i\n\n", cont2);
	return 0;
}

void entrada (int *cont, int num[])
{
	char op;
	int i;
	for (i=0; i<N; i++)
	{
		printf ("Introduce número:\n");
		scanf ("%i", &num[i]);
		cont++;
		printf ("Desea introducir otro número?[s/n]\n");
		getchar();
		scanf ("%c", &op);
		if ((op=='s')||(op=='S'))
		{
			continue;
		}
		else
		{
			return;
		}
	}
}

void cargar_fichero (int cont, int num[])
{
	FILE *f;
	int i;
	f = fopen ("archivo.txt", "w");
	for (i=0; i<cont; i++)
	{
		fprintf (f, "%i\n", num[i]);
	}
	fclose (f);
}
De esta forma, me sigue teniendo en cuenta (a la hora de contar los negativos) el primer elemento. Sin embargo, el archivo queda vacío.

:? ¿Porque? :?

Anon
Mensajes: 15
Registrado: 07/03/2013 12:00 pm

#3 Mensaje por Anon » 28/05/2013 7:29 am

Solucionado

En los procedimientos "entrada" dónde se recibe cómo parámetro el puntero "cont", dónde pone "cont ++;" hay que poner "(*cont)=(*cont)+1;" para que en la dirección de memoria se almacene el valor adecuado.

Saludos.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 5 invitados