Visita nuestros Foros de C/C++
  Crea una cuenta gratuitamente Inicio  ·  Temas  ·  Tu Cuenta  ·  Envía Noticias  ·  FOROS  
Contenido

Menú

Picasa


Languages
Selecciona Idioma de la Interfaz:


Forums


Patrocinador

Blogs
Otro innecesario blog más

Nideaderedes

www.elrincondelc.com :: Ver tema - Fichero leer contenido
 FAQFAQ   BuscarBuscar   Grupos de UsuariosGrupos de Usuarios   PerfilPerfil   Entre para ver sus mensajes privadosEntre para ver sus mensajes privados   LoginLogin 


Fichero leer contenido
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema   Foros de discusión -> Algoritmos
Ver tema anterior :: Ver tema siguiente  
AutorMensaje
Sasuke
¡Ya se hablar!
¡Ya se hablar!


Registrado: Mar 01, 2006
Mensajes: 11

MensajePublicado: J    Asunto: Fichero leer contenidoResponder citando

Muy buenas!

Tengo una matriz en un fichero que se llama matriz.txt que contiene:
3 3
1 0 1
0 1 0
1 1 1
esta matriz la primera fila indica las dimensiones de la matriz y el resto es la matriz, el problema es que no se como hacer para asociar desde el archivo txt a variable y asi poder guardar los datos en variables, considerando que esta matriz tiene espacios y valores que tengo que aprobechar en el programa.
Aparte de esto tengo otro archivo con nombres en columnas:
BARCELONA
CEUTA
MADRID...
Como puedo hacer que este contenido asociarlo a variables distintas, que char nombre1 sea Barcelona y char nombre2 sea CEUTA?
AGRADECERIA MUCHO UNA AYUDA
Volver arriba
Ver perfil de usuario Enviar mensaje privado
macu
Hablador
Hablador


Registrado: May 02, 2005
Mensajes: 219
Ubicación: Galicia

MensajePublicado: J    Asunto: Responder citando

- Para leer el contenido del fichero que almacena la matriz te recomiendo que uses la función fscanf().
- Para leer el contenido del fichero que almacena las ciudades puedes usar la función fgets(). Esta función leerá toda la línea, por lo que deberás tener una ciudad en cada línea. Para almacenar las ciudades en variables puedes crear una lista enlazada e ir cargando las ciuidades.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Sasuke
¡Ya se hablar!
¡Ya se hablar!


Registrado: Mar 01, 2006
Mensajes: 11

MensajePublicado: J    Asunto: Responder citando

gracias Macu, me podrias poner un pequeño ejemplo que de las paginas que veo las funciones que he leido no las veo muy claras, te lo agradeceria mucho, GRACIAS, me estas siendo de gran ayuda
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Sasuke
¡Ya se hablar!
¡Ya se hablar!


Registrado: Mar 01, 2006
Mensajes: 11

MensajePublicado: V    Asunto: Responder citando

Haber he intentado hacer el codigo como me as dicho para asociar cada valor de la matriz a una incognita pero no me sale, dejo el codigo y haber si alguien puede solventar el problema:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<io.h>
int main()
{
FILE *fichero;
fichero = fopen( "Matriz.txt", "r" );
int iMax,i;
iMax=(sizeof(fichero));
int x2[sizeof(fichero)];
for( i=1; i<=iMax; i++ )
{
fscanf(fichero, "%d", &x2[i] );
printf( "%d", x2[i] );
}
fclose(fichero);
gets("");
return 0;
}
La matriz es esta:
5 5
0 1 1 0 0
1 0 1 0 0
1 1 0 1 1
0 0 1 0 1
0 0 1 1 0
Volver arriba
Ver perfil de usuario Enviar mensaje privado
rir3760
Gran Gurú



Registrado: Oct 02, 2004
Mensajes: 1684
Ubicación: Mexico

MensajePublicado: V    Asunto: Responder citando

El operador sizeof te devuelve el numero de caracteres necesarios para almacenar la variable de tipo 'FILE *' pero no te devuelve el tamaño del archivo.

Una posible solucion es:

1) Trata de leer dos numeros (numero de filas y columnas)del archivo, si esto no es posible abortas el programa.
2) Reservas memoria suficiente para "filas * columnas" elementos, esto lo realizas utilizando la funcion malloc.
3) Lees cada elemento del archivo mediante fscanf verificando en cada paso que se pueda leer con exito el elemento, esto no lo implemente en el programa que sigue a continuacion.

Implementado en C estandar:
Código:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   FILE *entrada;
   int fil, col;
   int *matriz;
   int i, j;
   
   if ((entrada = fopen("datos.txt", "r")) == NULL)
      return EXIT_FAILURE;
   if (fscanf(entrada, "%d %d", &fil, &col) != 2){
      fclose(entrada);
      return EXIT_FAILURE;
   }
   if (fil < 1 || col < 1){
      fclose(entrada);
      return EXIT_FAILURE;
   }
   
   if ((matriz = malloc(fil * col * sizeof *matriz)) == NULL){
      fclose(entrada);
      return EXIT_FAILURE;
   }
   
   for (i = 0; i < fil * col; i++)
      fscanf(entrada, "%d", &matriz[i]);
   
   puts("Datos leidos:");
   for (i = 0; i < fil; i++){
      for (j = 0; j < col; j++)
         printf("%4d", matriz[i * col + j]);
      puts("");
   }
   
   free(matriz);
   fclose(entrada);
   
   return EXIT_SUCCESS;
}


El contenido del archivo 'datos.txt' es:
Código:
5 5
0  1  2  3  4
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
40 41 42 43 44


Y la salida del programa es:
Código:
Datos leidos:
   0   1   2   3   4
  10  11  12  13  14
  20  21  22  23  24
  30  31  32  33  34
  40  41  42  43  44


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Ver perfil de usuario Enviar mensaje privado
4DIMENSION
Hablador
Hablador


Registrado: Jun 14, 2004
Mensajes: 171

MensajePublicado: V    Asunto: Cherry Coke - No Hagas El Indio, Haz El CherokeeResponder citando

Si no esperas trabajar con matrices muy grandes, puedes pasar de la asginación dinámica de memoria, y declarar una matriz más grande de lo que esperes, por ejemplo, 20×20.
_________________
Compra Cds y DVDs sin canon, es la misma calidad y mucho más baratos.
[img=http://barrapunto.com/pollBooth.pl?section=&qid=350&aid=2]
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Sasuke
¡Ya se hablar!
¡Ya se hablar!


Registrado: Mar 01, 2006
Mensajes: 11

MensajePublicado: V    Asunto: Responder citando

rir3760 te agradezco plenamento el aporte, pero tengo una dudilla la funcion Malloc, no la entiendo y no se como hacerla. La matriz ke tengo ke hacer es de 5x5 pero luego me piden que lea de un archivo una de 100x100. Gracias GENTE!!!!
Porque si hago lo siguiente el programa me peta cuando almaceno los valores de la matriz en la variable int matriz?
Código:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
   FILE *Archivo;
   int iFil,iCol, *iMatriz,i,j;
   if((Archivo=fopen("Matriz.txt","r"))==NULL)
   {
      return EXIT_FAILURE;
   }
   fscanf(Archivo,"%d %d", &iFil,&iCol);
   printf("Filas=%i  Columnas=%i",iFil,iCol);
   if(iFil<1 ||iCol<1)
   {
      return EXIT_FAILURE;
   }
   else
   {
      for(i=0;i<(iFil*iCol);i++)
      {
         fscanf(Archivo,"%d",&iMatriz[i]);
      }
   }

   gets("");
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
rir3760
Gran Gurú



Registrado: Oct 02, 2004
Mensajes: 1684
Ubicación: Mexico

MensajePublicado: S    Asunto: Responder citando

Sasuke escribió:
rir3760 te agradezco plenamento el aporte, pero tengo una dudilla la funcion Malloc, no la entiendo y no se como hacerla.

La funcion malloc es parte de la biblioteca estandar de C y solo tienes que llamarla en la forma:
Código:
#include <stdlib.h> /* malloc */

/* ... */

puntero = malloc(N * sizeof *puntero);

Donde N es el numero de elementos que piensas almacenar, por ejemplo si quieres almacenar 10 enteros (tipo 'int'):
Código:
#include <stdlib.h> /* malloc */

/* ... */

int *puntero;

/* ... */

puntero = malloc(10 * sizeof *puntero);


Sasuke escribió:
Porque si hago lo siguiente el programa me peta cuando almaceno los valores de la matriz en la variable int matriz?

Tu programa revienta debido a que no reservas memoria, intenta con:
Código:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   FILE *Archivo;
   int *iMatriz;
   int iFil, iCol;
   int i;
   
   if ((Archivo = fopen("Matriz.txt", "r")) == NULL)
      return EXIT_FAILURE;
   if (fscanf(Archivo, "%d %d", &iFil, &iCol) != 2)
      return EXIT_FAILURE;
   
   printf("Filas=%i  Columnas=%i", iFil, iCol);
   if (iFil < 1 || iCol < 1)
      return EXIT_FAILURE;
   else {
      if ((iMatriz = malloc(iFil * iCol * sizeof *iMatriz)) == NULL){
         fclose(Archivo);
         return EXIT_FAILURE;
      }
     
      for (i = 0;i < (iFil*iCol);i++)
         fscanf(Archivo, "%d", &iMatriz[i]);
   }
   
   /* gets(""); **EVITA** el uso de gets, en su lugar usa fgets */
   free(iMatriz);
   
   return EXIT_SUCCESS;
}


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Sasuke
¡Ya se hablar!
¡Ya se hablar!


Registrado: Mar 01, 2006
Mensajes: 11

MensajePublicado: S    Asunto: Responder citando

Buenas de nuevo, he probado lo que me as puesto y me salia un error xq tenia que poner delante de malloc (int*) pero olle lo e solucionado y va de perlas, te agradezco muchisimo la ayuda que me as proporcionado, espero terminar esta practica sin tener mas problemas GRACIAS
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Sasuke
¡Ya se hablar!
¡Ya se hablar!


Registrado: Mar 01, 2006
Mensajes: 11

MensajePublicado: S    Asunto: Responder citando

Vua Mi nuevo problema, ahora estoy con el reconocimiento de nombres del fichero nombres.txt que contiene diferentes nombres con saltos de lineas ago lo del fgets y todo va bien hasta que quiero asociar el tamaño de un string bidimensional que le quiero poner el numero de filas que ha leido anteriormente (la dimension de la matriz) pongo el codigo i comento:

Código:

FILE *fichero;
    if ((fichero = fopen("Nombres.txt", "r")) == NULL)
    return EXIT_FAILURE;

hasta aqui todo perfecto
Código:

    char linea[5][50];

aqui esta mi problema quiero poner char linea[iFila][50] pero no me deja me da un error al compilar
Código:

    i=0;
    while(i<=iFil)
   {
     printf( "%s\n",fgets(linea[i], 50, fichero));
     i=i+1;
   }
Volver arriba
Ver perfil de usuario Enviar mensaje privado
rir3760
Gran Gurú



Registrado: Oct 02, 2004
Mensajes: 1684
Ubicación: Mexico

MensajePublicado: D    Asunto: Responder citando

Sasuke escribió:
Código:
char linea[5][50];

aqui esta mi problema quiero poner char linea[iFila][50] pero no me deja me da un error al compilar

Eso se debe a que (supongo) tu compilador solo soporta el estandar de C ISO-C90 (el estandar de facto de C). Con este no se pueden declarar arrays en la forma que tu quieres, en otras palabras:
Código:
char foo[100];              /* Valido */
char bar[100 + rand() / 2]; /* No es valido */


La solucion es utilizar un puntero de tipo 'char (*)[50]' y reservar memoria mediante malloc, seria algo asi:
Código:
char (*linea)[50]; /* puntero a array */

/* ... */

if ((linea = malloc(iFila * sizeof *linea)) == NULL)
   /* Manejo de error */

for (i = 0; i < iFil; i++){
   if (fgets(&linea[i][0], sizeof linea[i], fichero) == NULL)
      /* Verificar si el estado es: error -O- EOF */
     
   printf("%s", &linea[i][0]);
}

/* ... */

free(linea);


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Sasuke
¡Ya se hablar!
¡Ya se hablar!


Registrado: Mar 01, 2006
Mensajes: 11

MensajePublicado: L    Asunto: Responder citando

rir3760 sigo con el lio de las matrices de nuevo lo que hemos conseguido antes era meter todos los terminos de la matriz en un integer y lo que necesito ahora es hacer posicion 0,0 de la matriz asociarle un valor al 0,1 otro valor i asi sucesivamente el valor de la variable integer seria int Numero[iFil][iCol] pero como reservo espacio con un malloc?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Sasuke
¡Ya se hablar!
¡Ya se hablar!


Registrado: Mar 01, 2006
Mensajes: 11

MensajePublicado: V    Asunto: Responder citando

Haber siguiendo con el problema e resuelto lo de las variables pero me siguen surtiendo problemas, me peta el programa y no se porque:
Código:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int main(void)
{
   FILE *Archivo;
   int **iMatriz=NULL;
   int iFil, iCol;
   int iAlgo;
   int i,j;
   if ((Archivo = fopen("Matriz.txt", "r")) == NULL)
   {
      return EXIT_FAILURE;
   }
   if (fscanf(Archivo, "%d %d", &iFil, &iCol) != 2)
   {
      return EXIT_FAILURE;
   }
   printf("Filas=%i  Columnas=%i", iFil, iCol);
   if (iFil < 1 || iCol < 1)
   {
      return EXIT_FAILURE;
   }
   else
   {
      if((iMatriz=(int**)malloc(iFil*sizeof(int *)))==NULL)
      {
         printf("Insuficiente espacio de memoria\n");
         return EXIT_FAILURE;
      }
      /* Asignar memoria para cada una de las filas */
      for(i=0;i<iFil;i++)
      {
         if((iMatriz[i]=(int *)malloc(iCol *sizeof(int)))==NULL)
         {
         printf("Insuficiente espacio de memoria\n");
         return EXIT_FAILURE;
      }
      for(i=0;i<iFil;i++)
      {
         for(j=0;j<iCol;j++)
         {
            fscanf(Archivo,"%d",&iMatriz[i][j]);
         }
      }
   }
   }
   gets("");
   free(iMatriz);
   return EXIT_SUCCESS;
}

I NEED HELP
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Sasuke
¡Ya se hablar!
¡Ya se hablar!


Registrado: Mar 01, 2006
Mensajes: 11

MensajePublicado: V    Asunto: Responder citando

Buenas gente! haber si me podeis decir esto:
Código:

for(contador1=0;contador1<iFil;contador1++)
            {

               printf("%s",fgets(&ciudades[contador1],50,pf2));
               //printf("%s",&ciudades[contador1]);
            }
            for(contador1=0;contador1<iFil;contador1++)
            {

              //   printf("%s",fgets(&ciudades[contador1],50,pf2));
               printf("%s\n",&ciudades[contador1]);
            }

tengo ke mostrar por pantalla el nombre de unas ciudades ke guardo en un archivo y me salen muy raras escritas...[/quote]
Volver arriba
Ver perfil de usuario Enviar mensaje privado
rir3760
Gran Gurú



Registrado: Oct 02, 2004
Mensajes: 1684
Ubicación: Mexico

MensajePublicado: L    Asunto: Responder citando

En el programa completo que publicaste antes de este mensaje:

* El error principal se debe a que el bucle donde lees los datos del archivo esta dentro del bucle donde reservas memoria para cada fila y por supuesto esto no es correcto:
Código:
/* Asignar memoria para cada una de las filas */
for(i=0;i<iFil;i++){
   if((iMatriz[i]=(int *)malloc(iCol *sizeof(int)))==NULL){
      printf("Insuficiente espacio de memoria\n");
      return EXIT_FAILURE;
   }
   
   for(i=0;i<iFil;i++){
      for(j=0;j<iCol;j++){
         fscanf(Archivo,"%d",&iMatriz[i][j]);
      }
   }
}


Este fragmento de codigo deberia estar estructurado de esta forma:
Código:
/* Asignar memoria para cada una de las filas */
for (i = 0;i < iFil;i++)
   if ((iMatriz[i] = malloc(iCol * sizeof *iMatriz[i])) == NULL){
      printf("Insuficiente espacio de memoria\n");
      return EXIT_FAILURE;
   }

/* Leer los datos almacenados en el archivo */
for (i = 0;i < iFil; i++)
   for (j = 0;j < iCol; j++)
      if (fscanf(Archivo, "%d", &iMatriz[i][j]) != 1){
         puts("Error al leer valores del archivo");
         return EXIT_FAILURE;
      }

* El header 'memory.h' no es parte de la biblioteca estandar de C y no lo necesitas, al menos no en relacion a malloc.
* Tienes que liberar la memoria de cada fila antes de liberar 'iMatriz'.
* Esta linea:
Código:
gets("");

La deberias de eliminar ya que lo usual es que un programa reviente cuando trate de almacenar N caracteres en "".

El programa modificado es:
Código:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   FILE *Archivo;
   int **iMatriz = NULL;
   int iFil, iCol;
   int i, j;
   
   if ((Archivo = fopen("Matriz.txt", "r")) == NULL)
      return EXIT_FAILURE;
   if (fscanf(Archivo, "%d %d", &iFil, &iCol) != 2)
      return EXIT_FAILURE;
   if (iFil < 1 || iCol < 1)
      return EXIT_FAILURE;
   
   printf("Filas=%i  Columnas=%i\n", iFil, iCol);

   if ((iMatriz = malloc(iFil * sizeof *iMatriz)) == NULL){
      printf("Insuficiente espacio de memoria\n");
      return EXIT_FAILURE;
   }
   
   /* Asignar memoria para cada una de las filas */
   for (i = 0; i < iFil; i++)
      if ((iMatriz[i] = malloc(iCol * sizeof *iMatriz[i])) == NULL){
         printf("Insuficiente espacio de memoria\n");
         return EXIT_FAILURE;
      }
   
   /* Leer los datos almacenados en el archivo */
   for (i = 0; i < iFil; i++)
      for (j = 0; j < iCol; j++)
         if (fscanf(Archivo, "%d", &iMatriz[i][j]) != 1){
            puts("Error al leer valores del archivo");
            return EXIT_FAILURE;
         }
   
   /* Prueba: imprimir los datos */
   for (i = 0;i < iFil;i++){
      for (j = 0;j < iCol;j++)
         printf("%3d", iMatriz[i][j]);
      puts("");
   }
   fclose(Archivo);
   
   /* Liberar la memoria de cada fila */
   for (i = 0; i < iFil; i++)
      free(iMatriz[i]);
   free(iMatriz);
   
   return EXIT_SUCCESS;
}


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Publicar nuevo tema   Responder al tema   Foros de discusión -> AlgoritmosTodas las horas son GMT + 10 Horas
Ir a página 1, 2  Siguiente
Página 1 de 2

 
Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro

 


Todos los logos y marcas son propiedad de sus respectivos propietarios. Los comentarios son propiedad de quien los escribió. El resto © by El Rincón del C - La comunidad de los programadores C/C++
You can syndicate our news using the file backend.php or ultramode.txt

Instalado y mantenido por UrlanSoft