Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Como leer un archivo de texto que no se la cantidad de datos?

Estas en el tema de Como leer un archivo de texto que no se la cantidad de datos? en el foro de C/C++ en Foros del Web. Hola maestros, la verdad de las cosas es que no se me ocurre como hacer eso, les cuento, necesito leer una matriz de nxm de ...
  #1 (permalink)  
Antiguo 26/11/2006, 19:41
Avatar de El_Metallick  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.718
Antigüedad: 21 años, 5 meses
Puntos: 16
Como leer un archivo de texto que no se la cantidad de datos?

Hola maestros, la verdad de las cosas es que no se me ocurre como hacer eso, les cuento, necesito leer una matriz de nxm de un archivo de texto, por ejemplo

Archivo

0 1 2 3 4
5 6 7 8 9
1 2 3 4 5
6 7 8 9 0
2 3 4 5 6

que eso me lo cargue en una matriz de 5x5 y que

0 1 2
3 4 5
6 7 8

lo cargue en una de 3x3

osea en el fondo que cargue los datos en una matriz de nxm en, osea se darle memoria pero no se como hacerlo si no se de antemano en numero de filas y columnoas de la matriz, y lo otro es que asi mismo no se leer el archivo de texto sin saber el largo y alto de la matriz. Como lo puedo hacer, la verdad es que yo trabajaba con fscanf pero para eso tendria que saber el número de columnas del archivo. bueno espero su ayuda... saludos y gracias de antemano
__________________
Haz la guerra en la cama y el amor donde se te de la gana...
El tiempo es el mejor maestro, lo único malo es que te mata...¡¡Aprovecha tu tiempo!!

Última edición por El_Metallick; 26/11/2006 a las 20:26
  #2 (permalink)  
Antiguo 29/11/2006, 16:01
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Pues para eso ya fscanf no te sirve mucho como dices.
Tendrias que leer bloques o todo el archivo de golpe y analizarlo.
O la otra, ir linea por linea.
Recuerda que una fila termina con un salto de linea "\n". Osea tienes que buscar saltos de lineas.

Es cuestion de saber trabajar ya un poco mejor con cadenas.
Al final usas sscanf para sacar datos de la linea que leiste y analisaste.

Saludos
  #3 (permalink)  
Antiguo 21/12/2006, 08:06
 
Fecha de Ingreso: diciembre-2006
Mensajes: 13
Antigüedad: 17 años, 4 meses
Puntos: 1
Re: Como leer un archivo de texto que no se la cantidad de datos?

Bueno te muestro la forma en que lo hice, fijate que lo paso todo a un archivo auxiliar y despues recien ahí a la matriz. Tambien fijate lo que hago para que no muestre lo de la matriz cuando ya no pudo colocar datos en ella porque se termino el archivo (ah, crea los archivos necesarios :) )... (Por supuesto hay muchas más formas de hacerlo):

<--Modificado y reparado :) , gracias MaxExtreme-->

Código:
#include<stdio.h>
#define L 2
#define N 5 // filas    
#define M 6 // columnas



void MostrarMatriz(char MATRIZ[N][M])
{
	int i,j;

	for(i=0;i<N;i++)
	{
		for(j=0;(j<M)&&(MATRIZ[i][j]!='\0');j++)
		{
			printf("%c ",MATRIZ[i][j]);

		}

		if(MATRIZ[i][j]=='\0')
		{
			i=N;
			j=M;
		}
		printf("\n");
	}
}

void Pasar_ArchAux(FILE *archivotxt,FILE *archivoauxtxt, int *nro)
{
	char LETRA[L];
	archivotxt= fopen("DatosMatriz.txt","r");
	archivoauxtxt=fopen("auxiliar.txt","w");

	if((archivotxt==NULL)&&(archivoauxtxt==NULL))
		printf("Error al acceder al archivo");
	else
	{
		fgets(LETRA,L,archivotxt);

		if(LETRA[0]=='\0')
		{
			while(!(feof(archivotxt)))
			{
				if(((LETRA[0]>='0')&&(LETRA[0]<='9')))
					fprintf(archivoauxtxt,"%c",LETRA[0]);
				printf("%s",LETRA);
				fgets(LETRA,L,archivotxt);
			}
		}
		else
			(*nro)--;
	}
	fclose(archivotxt);
	fclose(archivoauxtxt);
}

int main (void)
{
	int posn=0,posm=0,archvacio=1;
	char  caracter, MATRIZ[N][M];
	FILE *archivotxt=NULL, *archivoauxtxt=NULL;

	archivoauxtxt=fopen("auxiliar.txt","r");

	Pasar_ArchAux(archivotxt,archivoauxtxt,&archvacio);

	printf("\n");

	if((archivoauxtxt==NULL)||(archvacio==0))
		printf("Error al acceder al archivo o archivo vacio\n");
	else
	{
		caracter=fgetc(archivoauxtxt);
		for(posn=0;(posn<N)&&(!feof(archivoauxtxt));posn++)
		{
			for(posm=0;(posm<M)&&(!feof(archivoauxtxt));posm++)
			{		
				MATRIZ[posn][posm]=caracter;
				caracter=fgetc(archivoauxtxt);
			}
		}

		posn--;
		if((posn<N)&&(posm<M))
			MATRIZ[posn][posm]='\0';
		else
		{
			posn++;
			if(posn<N)
			{
				posm=0;
				MATRIZ[posn][posm]='\0';
			}	
		}
		printf("Muestro la Matriz resultante:\n\n");
		MostrarMatriz(MATRIZ);
	}

	fclose(archivoauxtxt);
	return 0;
}

Última edición por Aprendiz-DAO; 21/12/2006 a las 10:46
  #4 (permalink)  
Antiguo 21/12/2006, 08:21
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Como leer un archivo de texto que no se la cantidad de datos?

Prueba a pasarle un archivo NULL, adiós al programa :)
  #5 (permalink)  
Antiguo 22/12/2006, 09:53
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Como leer un archivo de texto que no se la cantidad de datos?

De hecho también me refería a este error:

Código:
if((archivotxt==NULL)&&(archivoauxtxt==NULL))
Si uno, y sólo uno, falla al abrirse, tendrá valor NULL, por tanto, el "if" no salta, no detectarás el error y finalmente el programa caerá.

Utiliza ||.

Otra cosa, te repito aquí lo mismo que en otro código:

Código:
void Pasar_ArchAux(FILE *archivotxt,FILE *archivoauxtxt, int *nro)
No hacen falta los dos primeros, puedes declararlos dentro de la función, dado que sólo los estás utilizando ahí. Es más, estás haciendo lo mismo dos veces:

@main()
Código:
archivoauxtxt=fopen("auxiliar.txt","r");
@Pasar_ArchAux()
Código:
archivoauxtxt=fopen("auxiliar.txt","w");
No le veo el sentido (una vez con "r", otra vez con "w" sin haberlo cerrado ni usado antes...)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:33.