problema con archivo

Iniciado por javahat, 29 Abril 2010, 22:24 PM

0 Miembros y 1 Visitante están viendo este tema.

javahat

Hola necesito trabajar con archivos pero tengo un problema al cargar los datos del archivo a un arreglo como lo puedo hacer? aquí dejo mi avance.

Código (c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct registro{

    char nombre[10) [Seleccionar]
;
    int edad;
};



void ingresardatos(struct registro personas[]){
  int i=0;

  for(i=0;i<3;i++){

  printf("Nombre:");
  scanf("%s", &personas[i].nombre);
  printf("Edad:");
  scanf("%d", &personas[i].edad);

  }


}


void guardarfichero(struct registro personas[]){

   int i;
    FILE *archivo;

    archivo=fopen("fichero.txt","w");

    for(i=0;i<3;i++){
       fprintf(archivo, "%s\n" ,personas[i].nombre);
       fprintf(archivo, "%d\n" ,personas[i].edad);

      }

fclose(archivo);
}

void cargarfichero(struct registro personas[]){
FILE *archivo;
int i;
archivo=fopen("fichero.txt","a");
  if(archivo==NULL){
      printf("No se ha podido abrir el archivo");
  }

  i=0;
  while(!feof(archivo)){

     
      fscanf(archivo, "%d", &personas[i].edad);
     
     printf("%s",personas[i].nombre);
     printf("%d",personas[i].edad);

   i++;


  }


  fclose(archivo);

}




main(){

struct registro personas[3];


  ingresardatos(personas);
  guardarfichero(personas);
  cargarfichero(personas);

}

leogtz

#1
Suponiendo que el contenido del archivo es algo así:

Michael Jackson
0
Lola Beltran
12
Leo Gutierrez R.
19


Prueba esto:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct fecha
{
    char nombre[100];
    unsigned int edad;
} personas[3];
void cargarArchivo(struct fecha personas[])
{
    FILE *archivo = fopen("file.txt", "r");
    unsigned int i = 0;
    if(archivo == NULL)
    {
        fprintf(stderr, "Error abriendo el archivo.");
        exit(1);
    }
    char linea[100];
    while(!feof(archivo))
    {
        fgets(linea, 100, archivo);
        strcpy(personas[i].nombre, linea);
        fgets(linea, 100, archivo);
        personas[i].edad = atoi(linea);
        i++;
    }
    fclose(archivo);
}
int main(void)
{
    cargarArchivo(personas);
    unsigned int i;
    for(i = 0; i < 3; i++)
        printf("Nombre : %sEdad : %u\n", personas[i].nombre, personas[i].edad);
    return EXIT_SUCCESS;
}
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Littlehorse

No deberías usar feof de esa forma. Es posible que si el archivo esta mal formateado en la segunda lectura alcances el final del archivo sin saberlo, por lo tanto quedaría contenido basura en la estructura.

while (fgets(linea, 100, archivo))
{
  //hago lo que sea con el buffer
    if(fgets(linea, 100, archivo))
         //hago de nuevo lo que sea con el buffer
}


O cualquier variación que se te ocurra entre eso y feof para no alcanzar el final del archivo sin que el programa se de cuenta.

Saludos!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

leogtz

Gracias por el comentario.

Sólo habría que cambiar por esto:


while(fgets(linea, 100, archivo))
    {
        strcpy(personas[i].nombre, linea);
        if(fgets(linea, 100, archivo))
        personas[i].edad = atoi(linea);
        i++;
    }
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

javahat

Gracias por los distintos consejos, he logrado abrir leer el archivo y pasarlo a una matriz pero cuando realizo el fscanf me toma en la ultima linea del archivo un registro basura con caracteres raros.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct registro{

    char nombre[10];
    char clave[10];
    char repetirclave[10];
    int edad;
};



void ingresardatos(struct registro personas[]){
  int i=0;

FILE *archivo;

archivo=fopen("fichero.txt","a+");


  for(i=0;i<3;i++){

  printf("Nombre:");

  scanf("%s",&personas[i].nombre);


  }
fclose(archivo);
}

void guardarfichero(struct registro personas[]){

   int i;
    FILE *archivo;

    archivo=fopen("fichero.txt","a+");

    for(i=0;i<3;i++){
       fprintf(archivo, "%s\n" ,personas[i].nombre);

   }

fclose(archivo);
}

void cargarfichero(struct registro personas[]){

FILE *archivo;
int i;

archivo=fopen("fichero.txt","r");
  if(archivo==NULL){
      printf("No se ha podido abrir el archivo");
  }
  i=0;


  while(!feof(archivo)){

  fscanf(archivo, "%s", &personas[i].nombre);

  printf("Numero %d :%s\n",i,personas[i].nombre);
  i++;


  }

fclose(archivo);
}

main(){

struct registro personas[50];


ingresardatos(personas);
guardarfichero(personas);
  cargarfichero(personas);


Dellarts

No he sabido encontrar el error pero cuando trabajes con estructuras si utilizas el fread te sera mas facil y no te dara el problema que te esta dando