Lectura de archivo secuencial a acceso directo

Iniciado por josri, 15 Noviembre 2012, 01:58 AM

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

josri

Hola saludos a todos, vengo para ver si me pueden hechar un cable, mi problema es el siguiente, tengo el codigo para poder leer un archivo secuencial, pero me falta escribir ese mismo archivo a uno de acceso directo y poder consultar el de acceso directo pero solo me quedo hasta la lectura del archivo secuencial :huh:...

Citar
#include <stdio.h>
#include <string.h>

int main(){
   FILE *archivo=NULL;
   char nombreArchivo [15];
   char contenido [128];
   char nombre [50];
   char paterno [50];
   char materno [50];
   char licenciatura[50];
   char matricula[15];

   printf("\nNombre de archivo: ");
   scanf("%s",&nombreArchivo);
   archivo = fopen(nombreArchivo,"r");

   while(archivo == NULL){
      printf("El archivo no pudo abrirse");
      printf("\n\nNombre de archivo: ");
      scanf("%s",&nombreArchivo);
      archivo = fopen(nombreArchivo,"r");
   }

   while(!feof(archivo)){

      fscanf(archivo,"%[^,],%[^,],%[^,],%[^,],%[^\n]\n",&nombre,&paterno,&materno,&licenciatura,&matricula);
      printf("\nNombre:%s",nombre);
      printf("\nA.Paterno:%s",paterno);
      printf("\nA.Materno:%s",materno);
      printf("\nLicenciatura:%s",licenciatura);
      printf("\nMatricula:%s",matricula);
      printf("\n----------------------------------\n");
    }
   fclose(archivo);
   system("pause");
   return 0;
}



rir3760

Los cambios que requiere el programa son muchos.

Lo primero que debes hacer es eliminar la inclusión del encabezado <string.h> ya que no es necesario, también hay que eliminar la pausa ya que no es parte del programa.

Y salvo casos excepcionales no se debe utilizar la función "feof" para controlar la lectura mediante un bucle, esto porque la función retorna verdadero (diferente de cero) solo después que una función de lectura falla.

Un archivo compuesto por lineas de texto plano no permite el acceso aleatorio primero porque varia la longitud de cada linea y segundo porque en ese modo no puede utilizarse la función "fseek" (no en la misma forma que un archivo abierto en modo "b").

¿Ya han visto el uso de estructuras? Porque para el acceso aleatorio lo usual es 1) Abrir el archivo en modo binario y 2) Escribir/Leer utilizando las funciones fwrite/fread, el objeto en cuestión es de tipo "struct x" el cual representa un registro.

Un programa que puede tomarse como base es:
#include <stdio.h>
#include <stdlib.h>

struct registro {
   char contenido [128];
   char nombre [50];
   char paterno [50];
   char materno [50];
   char licenciatura[50];
   char matricula[15];
};

int main(void)
{
   FILE *entrada;
   char nom_archivo[32];
   struct registro reg;
   
   puts("Nombre del archivo:");
   scanf("%31s", nom_archivo);
   if ((entrada = fopen(nom_archivo, "rb")) == NULL){
      perror(nom_archivo);
      return EXIT_FAILURE;
   }

   while(fread(&reg, sizeof reg, 1, entrada) == 1){
      printf("Nombre: %s\n", reg.nombre);
      printf("A.Paterno: %s\n", reg.paterno);
      printf("A.Materno: %s\n", reg.materno);
      printf("Licenciatura: %s\n", reg.licenciatura);
      printf("Matricula: %s\n", reg.matricula);
      puts("----");
   }
   fclose(entrada);
   
   return EXIT_SUCCESS;
}

Ese seria el equivalente para tener acceso aleatorio pero, como ya te había comentado, primero debemos saber si ya manejan estructuras.

Por supuesto lo primero que debes hacer es, mediante una operación similar, escribir los datos en el archivo.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

josri

Hola gracias por la ayuda, mira segun yo avance un poco pero me quedo trabado en una parte... para empezar el programa toma un archivo de texto que tiene como contenido algo mas o menos asi:

juan hernandez,perez,computacion,009090
jose,soto,leon,quimica,22222
           .
           .
         etc.

el programa lo que hace es un archivo nuevo y pasa la informacion del anterior al nuevo como archivo de acceso directo para que quede todo la informacion seguida en una sola linea, claro con los espacios de cada cadena, pero ahora mi problema es que a la hora de pasaar los datos al archivo nuevo solo pasa el ultimo alumno y lo que quiero es que se pasen todos los alumnos del archivo, les muestro el codigo que llevo...


Citar

/*
PROGRAMA DE CREACIÓN Y ESCRITURA EN UN ARCHIVO
DE ACCESO DIRECTO
*/
#include <stdlib.h>
#include <stdio.h>
char menu();
FILE *archivo=NULL;
void insertarAlumno();
void buscarAlumno();
char nombreArchivo [15];
void crearArchivo();

typedef struct{
char nombre[25];
char apellidoPaterno[25];
char apellidoMaterno[25];
char licenciatura[40];
char matricula[15];
}Alumno;

Alumno alu;

int main(){
    int opcion = 0;

    while(opcion != 3){

        printf("Programa de manejo de alumnos: ");
        printf("\n1. Crear un nuevo archivo de alumnos");
        printf("\n2. Cargar el archivo de acceso directo");
        printf("\n3. Salir");
        printf("\nQue opcion deseas: ");
        scanf("%d",&opcion);

        if(opcion == 1){
            crearArchivo();
        }

        else if(opcion == 2){
            insertarAlumno();
        }

   else if(opcion ==3){
      printf("Fin del programa");
   }

        else{
            printf("\nOpcion no válida");
        }

    }

}

void crearArchivo(){
    FILE *archivoDirecto;
    archivoDirecto=fopen("alumnosDirecto.txt","w");
    fclose(archivoDirecto);
}

void insertarAlumno(){

    FILE *archivoDirecto;
    int idAlumno;

    archivoDirecto=fopen("alumnosDirecto.txt","a");
    printf("\nNombre de archivo que desa cargar: ");
   scanf("%s",&nombreArchivo);
   archivo = fopen(nombreArchivo,"r");
   while(!feof(archivo)){

    fscanf(archivo,"%[^,],%[^,],%[^,],%[^,],%[^\n]\n",&alu.nombre,&alu.apellidoPaterno,&alu.apellidoMaterno,&alu.licenciatura,&alu.matricula);
   }
    fseek(archivoDirecto,idAlumno*sizeof(Alumno),SEEK_SET);

    fwrite(&alu,sizeof(Alumno),1,archivoDirecto);
    fclose(archivoDirecto);
}




Sospecho que mi error se encuentra en esta parte pero no se muy bien...
Citar
while(!feof(archivo)){
}

josri

Ya he solucionado el problema, gracias rir3760 por la informacion