C/Visual C - Leer datos de un archivo.txt y almacenarlos en una estructura

 
Vista:
sin imagen de perfil
Val: 1
Ha disminuido su posición en 27 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Leer datos de un archivo.txt y almacenarlos en una estructura

Publicado por Jefferson (1 intervención) el 21/01/2020 03:50:15
Buenos Días con todos,

Necesito ayuda con un programa que sea capaz de leer los datos de un fichero y almacenarlos en una estructura:
El fichero esta ordenado de la siguiente manera: la primera linea contiene el número de empleados que tiene la empresa y de la segunda en adelante los datos de cada empleado (Nombre1_nombre2_apellido1_apellido2 direccion telefono correo) por ejemplo:

//
5
Mary_Estefa_Gonzales_Carrion Av.Naciones_Unidas_310_Mañosca 067495859 [email protected]
Marco_Javier_Altamirano_Herrera Av.Los_Shyrirs 097676347 [email protected]
Eva_Maria_Garces_Casas Ambato 096746356 [email protected]
Juan_Jose_Flores_Alvarez España 097637645 [email protected]
Estela_Marta_Puerta_Velazco Av.Salle_Turubamba 097645637 [email protected]
//
Notese que los guiones bajos separan cadenas correspondientes al mismo apartado y el " " espacio es el que separa los campos de información,

Lo que tengo del programa es lo siguiente:
---------------------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct{
    char Nombre[60];
    char Direccion[100];
    int Telefono[9];
    char Email[30];
    int Faltas;
    int HorasTrabajadas;
}EMPLEADO;
 
void registrar_datos_personales();
void vaciar(char temp[]);
EMPLEADO *empleados;
int cont;
 
int main(){
    registrar_datos_personales();
    printf("Hay %d empleados en total\n",cont);
    for(int i=0;i<cont;i++){
		printf("nombre: %s\n",empleados[i].Nombre);
		printf("direccion: %s\n",empleados[i].Direccion);
		printf("numero: %s\n",empleados[i].Telefono);
		printf("email: %s\n",empleados[i].Email);
        printf("Atrasos: %d\n",empleados[i].Faltas);
        printf("Horas Trabajadas: %d\n\n",empleados[i].HorasTrabajadas);
	}
}
void registrar_datos_personales(){
    FILE *f;
    char linea[300], aux;
    int i,j;
    cont=0;
 
    f=fopen("empleados.txt","r");
 
    if(f==NULL){
        printf("No se puede abrir el archivo\n");
        return;
    }
    fgets(linea,300,f);
    while(!feof(f)){
		fgets(linea,300,f);
		cont++;
	}
	rewind(f);
	fgets(linea,300,f);
    empleados=(EMPLEADO*)malloc(cont*sizeof(EMPLEADO));
 
    for(i=0;!feof(f);i++){
		vaciar(linea);
		aux='\0';
		for(j=0;aux!=' ';j++){
			aux=fgetc(f);
			linea[j]=aux;
			if(aux=='_')
				linea[j]=' ';
		}
		strcpy(empleados[i].Nombre,linea);
		vaciar(linea);
		aux='\0';
		for(j=0;aux!=' ';j++){
			aux=fgetc(f);
			linea[j]=aux;
			if(aux=='_')
				linea[j]=' ';
		}
		strcpy(empleados[i].Direccion,linea);
		vaciar(linea);
		fgets(linea,10,f);
		for(j=0;aux!=' ';j++){
			aux=fgetc(f);
			linea[j]=aux;
		}
		strcpy(empleados[i].Telefono,linea);
		fgets(linea,30,f);
		for(j=0;aux=='\n';j++){
			aux=fgetc(f);
			linea[j]=aux;
		}
		strcpy(empleados[i].Email,linea);
		vaciar(linea);
		empleados[i].Faltas=0;
		empleados[i].HorasTrabajadas=0;
	}
    fclose(f);
}
void vaciar(char temp[]){
	for(int i=0;i<300;i++)
		temp[i]=NULL;
}


Hace lo solicitado pero siento que esta demasiado largo y necesito una manera de hacerlo más eficiente, además de tomar el dato de la primera linea como numero de trabajadores sin tener que realizar el contador de lineas que tiene el archivo.
De antemano muchas gracias, espero su pronta respuesta
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 36
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Leer datos de un archivo.txt y almacenarlos en una estructura

Publicado por Allan (18 intervenciones) el 25/02/2020 22:23:54
Tal vez esto te pueda ayudar

AList es una lista que yo mismo hice

Estas funciones pueden concatenar cadenas y separar cadenas con un carácter

Puedes separar algunas cadenas con la funcion separar

Si deseas ver como guardar archivos y tratar cadenas, estos repositorios pueden ayudarte
https://github.com/EdGames05/CIA-Compiler

https://github.com/EdGames05/CIA-Compiler

Solo busca en las carpetas scr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdlib.h>
#include <cstring>
#include <string>
#include <memory>
#include "AList.h"
 
char* Funciones::concatenar_char(const char* cadena,const char* concatenar){
    char *cadena_final = (char*) malloc(1 + strlen(cadena) + strlen(concatenar));
    strcpy(cadena_final,cadena);
    strcat(cadena_final,concatenar);
    free(&cadena);
    free(&concatenar);
    return cadena_final;
}
 
AList<string> Funciones::separar(string texto, string separador){
    AList<string> lista;
    if((texto == "") || (separador == "")){
        return lista;
    }
    else{
        string pala = "";
        for(unsigned int i = 0; i < texto.size(); i++){
            if((texto[i] != separador[0])&& (texto[i] != '\n')){
                pala += texto[i];
            }
            else{
                lista.insertar(pala);
                pala = "";
            }
 
            if((i == texto.size() - 1) && (pala != "")){
                lista.insertar(pala);
            }
        }
        return lista;
    }
}

Esto es para los archivos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#define ARCHI_ESCRITURA_BINARIA "rb+"
#define ARCHI_LECTURA_BINARIA "rb"
#define CREAR_ARCHIVO "a"
#define ARCHI_ESCRITURA_TEXTO_PLANO "a+t"
 
void leerArchivo(const char* nombreArchivo){
    archi = fopen(nombreArchivo,ARCHI_LECTURA_BINARIA);
 
    if(archi == NULL){
        fclose(archi);
        return -1;
    }
    else{
        unsigned int codigo = 0;
        fseek(archi,0,SEEK_SET);
        fread(&archivos,sizeof(archivos),1,archi);
        string cadena = "";
        while(!feof(archi)){
            // Aqui lo puedes guardar en una cadena
            cadena += archivos.cadena;
            fread(&archivos,sizeof(archivos),1,archi);
        }
 
        fclose(archi);
        return codigo;
    }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar