Skip to content

Instantly share code, notes, and snippets.

@Canx
Created March 1, 2019 16:18
Show Gist options
  • Save Canx/42ef1d8cb6a29baa3dd9fc457a0cfd47 to your computer and use it in GitHub Desktop.
Save Canx/42ef1d8cb6a29baa3dd9fc457a0cfd47 to your computer and use it in GitHub Desktop.
mezclar.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int comparar(char *cad1, char *cad2) {
int i=0;
while ((cad1[i]!='\0') && (cad2[i] != '\0')) {
if (cad1[i] < cad2[i]) return -1;
if (cad1[i] > cad2[i]) return 1;
i++;
}
if ((cad1[i]=='\0') && (cad2[i]=='\0')) return 0;
else if (cad1[i]=='\0') return -1;
else return 1;
}
void obtener_campo(char* linea, int n, char* buffer) {
int campo_actual = 0;
int i = 0;
char caracter_actual = 0;
while(campo_actual != n && linea[caracter_actual] != '\0') {
if (linea[caracter_actual] == ' ') campo_actual++;
caracter_actual++;
}
// Copiamos el campo
while(linea[caracter_actual] != '\0' &&
linea[caracter_actual] != ' ' &&
linea[caracter_actual] != '\n') {
buffer[i] = linea[caracter_actual];
i++;
caracter_actual++;
}
buffer[i] = '\0';
}
void concatenar(char *cad1, char *cad2, char *cad3) {
int i=0,j=0;
while (cad1[i]!='\0') {
cad3[i] = cad1[i];
i++;
}
while (cad2[j]!='\0') {
cad3[i] = cad2[j];
i++; j++;
}
cad3[i]='\0';
}
void imprimir(char* linea, FILE *fichero) {
char nombre[1024];
char telefono[1024];
char email[1024];
char nuevo_campo[1024];
char letra[2];
obtener_campo(linea, 0, nombre);
obtener_campo(linea, 1, telefono);
obtener_campo(linea, 2, email);
letra[0] = email[0];
letra[1] = '\0';
concatenar(telefono, letra, nuevo_campo);
fprintf(fichero, "%s %s %s %s\n", nombre, telefono, email, nuevo_campo);
}
void mezcla (FILE *pfich1, FILE *pfich2, FILE *pfich3) {
size_t len = 0;
char *linea1 = NULL;
char *linea2 = NULL;
int leidos1, leidos2;
leidos1 = getline(&linea1, &len, pfich1);
leidos2 = getline(&linea2, &len, pfich2);
while(leidos1 != -1 && leidos2 != -1) {
if (comparar(linea1, linea2) < 0 ) {
imprimir(linea1, pfich3);
leidos1 = getline(&linea1, &len, pfich1);
}
else {
imprimir(linea2, pfich3);
leidos2 = getline(&linea2, &len, pfich2);
}
}
while (leidos1 != -1) {
imprimir(linea1, pfich3);
leidos1 = getline(&linea1, &len, pfich1);
}
while (leidos2 != -1) {
imprimir(linea2, pfich3);
leidos2 = getline(&linea2, &len, pfich2);
}
}
int main() {
FILE *agenda1 = fopen("agenda1", "r");
FILE *agenda2 = fopen("agenda2", "r");
FILE *agenda3 = fopen("agenda3", "w");
mezcla(agenda1, agenda2, agenda3);
fclose(agenda1);
fclose(agenda2);
fclose(agenda3);
}
@Canx
Copy link
Author

Canx commented Mar 1, 2019

Los archivos "agenda1", "agenda2" y "agenda3" tienen que tener lineas con los campos separados por espacios.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment