Traducir a otro lenguaje de programación:
0
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
#include <string.h>
#ifdef __linux__
    #include <termios.h>
    #include <unistd.h>
    #define CLEAR_SCREEN "clear"
    int _getch ();
    #define _lfind lfind
    #define _strdup strdup
#else
    #include <conio.h>
    #define CLEAR_SCREEN "cls"
    #if defined(__MSDOS__) || defined(__BORLANDC__)
        #define _getch getch
        #define _lfind lfind
        #define _strdup strdup
    #endif
#endif

typedef struct ADTCliente {
    char* RFC;
    char* razon_social;
    char* direccion_fiscal;
    char* codigo_postal;
    char* telefono;
    char* municipio;
    char* estado;
} Cliente;

void* array_insert  (void *array_var, size_t *length, size_t size, const void *datum);
void* array_remove  (void *array_var, size_t *length, size_t size, const void *datum);
void  array_foreach (void *array_var, size_t length, size_t size, void *params, void (*func)(void*,void*));
void  pause_screen (const char *message);
char* read_string_line (const char *message);
char* read_str (const char *message, char *string_var);
int   read_integer (const char *message);
int   read_field (FILE *file_stream, char *field);
int   compare_cliente (const Cliente *cliente1, const Cliente *cliente2);
void  print_cliente (Cliente *datum, int *counter);
void  print_on_file (Cliente *datum, FILE *file_stream);

const char *path = "clientes.tsv";

int main (void)
{
    Cliente *clientes = NULL;
    size_t length=0;
    Cliente *datum = NULL, cliente;
    int counter=0, main_option, suboption;
    char field[255];
    FILE *file_stream = fopen (path, "r");
    if (file_stream!=NULL)
    {
        while (read_field (file_stream, field))
        {
            cliente.RFC = _strdup (field);
            read_field (file_stream, field);
            cliente.razon_social = _strdup (field);
            read_field (file_stream, field);
            cliente.direccion_fiscal = _strdup (field);
            read_field (file_stream, field);
            cliente.codigo_postal = _strdup (field);
            read_field (file_stream, field);
            cliente.telefono = _strdup (field);
            read_field (file_stream, field);
            cliente.municipio = _strdup (field);
            read_field (file_stream, field);
            cliente.estado = _strdup (field);
            clientes = (Cliente*) array_insert (clientes, &length, sizeof (Cliente), &cliente);
        }
        fclose (file_stream);
    }
    do {
        putchar ('
'
);
        system (CLEAR_SCREEN);
        printf ("MEN\351\n");
        printf ("1.- Altas\n");
        printf ("2.- Consultas\n");
        printf ("3.- Actualizaciones\n");
        printf ("4.- Bajas\n");
        printf ("5.- Ordenar registros\n");
        printf ("6.- Listar registros\n");
        printf ("7.- Salir\n");
        printf ("Seleccione una opci\242n: ");
        fflush (stdout);
        do
            main_option = _getch ();
        while (main_option<'1' || main_option>'7');
        printf ("%c\n\n", main_option);
        if (length==0 && main_option!='1' && main_option!='7')
        {
            pause_screen ("No hay registros.\n");
            continue;
        }
        if (main_option<'5')
        {
            cliente.RFC = read_str ("Ingrese el RFC del cliente", field);
            datum = (Cliente*) _lfind (&cliente, clientes, &length, sizeof (Cliente), (int(*)(const void*,const void*))compare_cliente);
            if (datum!=NULL)
            {
                putchar ('\n');
                print_cliente (datum, &counter);
            }
        }
        if (main_option=='1' && datum!=NULL)
            printf ("El registro ya existe.\n");
        else if (main_option>='2' && main_option<='4' && datum==NULL)
            printf ("\nRegistro no encontrado.\n");
        else switch (main_option)
        {
            case '1':
                cliente.RFC = _strdup (field);
                cliente.razon_social = read_string_line ("Ingrese el razon social");
                cliente.direccion_fiscal = read_string_line ("Ingrese el direccion fiscal");
                cliente.codigo_postal = read_string_line ("Ingrese el codigo postal");
                cliente.telefono = read_string_line ("Ingrese el telefono");
                cliente.municipio = read_string_line ("Ingrese el municipio");
                cliente.estado = read_string_line ("Ingrese el estado");
                clientes = (Cliente*) array_insert (clientes, &length, sizeof (Cliente), &cliente);
                printf ("\nRegistro agregado correctamente.\n");
                break;
            case '3':
                printf ("Men\243 de actualizaci\242n de campos\n");
                printf ("1.- razon social\n");
                printf ("2.- direccion fiscal\n");
                printf ("3.- codigo postal\n");
                printf ("4.- telefono\n");
                printf ("5.- municipio\n");
                printf ("6.- estado\n");
                do {
                    suboption = read_integer ("Seleccione el n\243mero de campo a modificar");
                    if (suboption<1 || suboption>6)
                        printf ("Opci\242n incorrecta\n");
                } while (suboption<1 || suboption>6);
                switch (suboption)
                {
                    case 1:
                        free (datum->razon_social);
                        datum->razon_social = read_string_line ("Ingrese el nuevo razon social");
                        break;
                    case 2:
                        free (datum->direccion_fiscal);
                        datum->direccion_fiscal = read_string_line ("Ingrese el nuevo direccion fiscal");
                        break;
                    case 3:
                        free (datum->codigo_postal);
                        datum->codigo_postal = read_string_line ("Ingrese el nuevo codigo postal");
                        break;
                    case 4:
                        free (datum->telefono);
                        datum->telefono = read_string_line ("Ingrese el nuevo telefono");
                        break;
                    case 5:
                        free (datum->municipio);
                        datum->municipio = read_string_line ("Ingrese el nuevo municipio");
                        break;
                    case 6:
                        free (datum->estado);
                        datum->estado = read_string_line ("Ingrese el nuevo estado");
                        break;
                }
                printf ("\nRegistro actualizado correctamente.\n");
                break;
            case '4':
                memcpy (&cliente, datum, sizeof (Cliente));
                clientes = (Cliente*) array_remove ((void**)clientes, &length, sizeof (Cliente), datum);
                free (cliente.RFC);
                free (cliente.razon_social);
                free (cliente.direccion_fiscal);
                free (cliente.codigo_postal);
                free (cliente.telefono);
                free (cliente.municipio);
                free (cliente.estado);
                printf ("Registro eliminado correctamente.\n");
                break;
            case '5':
                qsort (clientes, length, sizeof (Cliente), (int(*)(const void*,const void*))compare_cliente);
                printf ("Registros ordenados correctamente.\n");
                break;
            case '6':
                counter = 0;
                array_foreach (clientes, length, sizeof (Cliente), &counter, (void(*)(void*,void*))print_cliente);
                printf ("Total de registros: %d.\n", counter);
                break;
        }
        if (main_option!='7')
            pause_screen ("");
    } while (main_option!='7');
    file_stream = fopen (path, "w");
    if (file_stream!=NULL)
    {
        array_foreach (clientes, length, sizeof (Cliente), file_stream, (void(*)(void*,void*))print_on_file);
        fclose (file_stream);
    }
    return EXIT_SUCCESS;
}

void* array_insert (void *array_var, size_t *length, size_t size, const void *datum)
{
    char *record_var;
    array_var = realloc (array_var, size * (*length+1));
    record_var = (char*)array_var + *length * size;
    memcpy (record_var, datum, size);
    (*length)++;
    return array_var;
}

void* array_remove (void *array_var, size_t *length, size_t size, const void *datum)
{
    size_t i;
    char *record_var = (char*)array_var;
    for (i=0; i<*length && datum!=record_var; i++, record_var+=size);
    if (i<*length)
    {
        for (i++; i<*length; i++)
        {
            record_var+=size;
            memcpy (record_var-size, record_var, size);
        }
        (*length)--;
        array_var = realloc (array_var, size * (*length));
    }
    return array_var;
}

void array_foreach (void *array_var, size_t length, size_t size, void *params, void (*func)(void*,void*))
{
    char *record_var = (char*)array_var;
    if (length>0)
    {
        func (record_var, params);
        array_foreach (record_var+size, length-1, size, params, func);
    }
}

int compare_cliente (const Cliente *cliente1, const Cliente *cliente2)
{
    return cliente1==cliente2 ? 0 : strcmp (cliente1->RFC, cliente2->RFC);
}

void print_cliente (Cliente *datum, int *counter)
{
    printf ("RFC             : %s\n", datum->RFC);
    printf ("razon social    : %s\n", datum->razon_social);
    printf ("direccion fiscal: %s\n", datum->direccion_fiscal);
    printf ("codigo postal   : %s\n", datum->codigo_postal);
    printf ("telefono        : %s\n", datum->telefono);
    printf ("municipio       : %s\n", datum->municipio);
    printf ("estado          : %s\n", datum->estado);
    putchar ('\n');
    (*counter)++;
}

void print_on_file (Cliente *datum, FILE *file_stream)
{
    fprintf (file_stream, "%s\t", datum->RFC);
    fprintf (file_stream, "%s\t", datum->razon_social);
    fprintf (file_stream, "%s\t", datum->direccion_fiscal);
    fprintf (file_stream, "%s\t", datum->codigo_postal);
    fprintf (file_stream, "%s\t", datum->telefono);
    fprintf (file_stream, "%s\t", datum->municipio);
    fprintf (file_stream, "%s\n", datum->estado);
}

char* read_string_line (const char *message)
{
    char string_line[255];
    (void) read_str (message, string_line);
    return _strdup (string_line);
}

char* read_str (const char *message, char *string_var)
{
    printf ("%s: ", message);
    scanf ("%[^\r\n]", string_var);
    (void) getchar ();
    return string_var;
}

int read_integer (const char *message)
{
    int integer_var;
    printf ("%s: ", message);
    scanf ("%d", &integer_var);
    (void) getchar();
    return integer_var;
}

int read_field (FILE *file_stream, char *field)
{
    fscanf (file_stream, "%[^\t\n\r]", field);
    fgetc (file_stream);
    return feof (file_stream) == 0;
}

void pause_screen (const char *message)
{
    printf ("%s\nPresione una tecla para continuar . . . ", message);
    fflush (stdout);
    _getch ();
}

#ifdef __linux__

int _getch ()
{
    int ch;
    struct termios oldt, newt;
    tcgetattr (STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr (STDIN_FILENO, TCSANOW, &newt);
    ch = getchar();
    tcsetattr (STDIN_FILENO, TCSANOW, &oldt);
    return ch;
}

#endif