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 ADTProducto {
    char* codigo_de_barras;
    char* descripcion;
    char* proveedor;
    float costo;
    float venta;
    float impuestos;
    int cantidad_existente;
} Producto;

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);
float read_decimal (const char *message);
int   read_field (FILE *file_stream, char *field);
int   compare_producto (const Producto *producto1, const Producto *producto2);
void  print_producto (Producto *datum, int *counter);
void  print_on_file (Producto *datum, FILE *file_stream);

const char *path = "productos.tsv";

int main (void)
{
    Producto *productos = NULL;
    size_t length=0;
    Producto *datum = NULL, producto;
    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))
        {
            producto.codigo_de_barras = _strdup (field);
            read_field (file_stream, field);
            producto.descripcion = _strdup (field);
            read_field (file_stream, field);
            producto.proveedor = _strdup (field);
            read_field (file_stream, field);
            producto.costo = atof (field);
            read_field (file_stream, field);
            producto.venta = atof (field);
            read_field (file_stream, field);
            producto.impuestos = atof (field);
            read_field (file_stream, field);
            producto.cantidad_existente = atoi (field);
            productos = (Producto*) array_insert (productos, &length, sizeof (Producto), &producto);
        }
        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')
        {
            producto.codigo_de_barras = read_str ("Ingrese el codigo de barras del producto", field);
            datum = (Producto*) _lfind (&producto, productos, &length, sizeof (Producto), (int(*)(const void*,const void*))compare_producto);
            if (datum!=NULL)
            {
                putchar ('\n');
                print_producto (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':
                producto.codigo_de_barras = _strdup (field);
                producto.descripcion = read_string_line ("Ingrese el descripcion");
                producto.proveedor = read_string_line ("Ingrese el proveedor");
                producto.costo = read_decimal ("Ingrese el costo");
                producto.venta = read_decimal ("Ingrese el venta");
                producto.impuestos = read_decimal ("Ingrese el impuestos");
                producto.cantidad_existente = read_integer ("Ingrese el cantidad existente");
                productos = (Producto*) array_insert (productos, &length, sizeof (Producto), &producto);
                printf ("\nRegistro agregado correctamente.\n");
                break;
            case '3':
                printf ("Men\243 de actualizaci\242n de campos\n");
                printf ("1.- descripcion\n");
                printf ("2.- proveedor\n");
                printf ("3.- costo\n");
                printf ("4.- venta\n");
                printf ("5.- impuestos\n");
                printf ("6.- cantidad existente\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->descripcion);
                        datum->descripcion = read_string_line ("Ingrese el nuevo descripcion");
                        break;
                    case 2:
                        free (datum->proveedor);
                        datum->proveedor = read_string_line ("Ingrese el nuevo proveedor");
                        break;
                    case 3:
                        datum->costo = read_decimal ("Ingrese el nuevo costo");
                        break;
                    case 4:
                        datum->venta = read_decimal ("Ingrese el nuevo venta");
                        break;
                    case 5:
                        datum->impuestos = read_decimal ("Ingrese el nuevo impuestos");
                        break;
                    case 6:
                        datum->cantidad_existente = read_integer ("Ingrese el nuevo cantidad existente");
                        break;
                }
                printf ("\nRegistro actualizado correctamente.\n");
                break;
            case '4':
                memcpy (&producto, datum, sizeof (Producto));
                productos = (Producto*) array_remove ((void**)productos, &length, sizeof (Producto), datum);
                free (producto.codigo_de_barras);
                free (producto.descripcion);
                free (producto.proveedor);
                printf ("Registro eliminado correctamente.\n");
                break;
            case '5':
                qsort (productos, length, sizeof (Producto), (int(*)(const void*,const void*))compare_producto);
                printf ("Registros ordenados correctamente.\n");
                break;
            case '6':
                counter = 0;
                array_foreach (productos, length, sizeof (Producto), &counter, (void(*)(void*,void*))print_producto);
                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 (productos, length, sizeof (Producto), 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_producto (const Producto *producto1, const Producto *producto2)
{
    return producto1==producto2 ? 0 : strcmp (producto1->codigo_de_barras, producto2->codigo_de_barras);
}

void print_producto (Producto *datum, int *counter)
{
    printf ("codigo de barras  : %s\n", datum->codigo_de_barras);
    printf ("descripcion       : %s\n", datum->descripcion);
    printf ("proveedor         : %s\n", datum->proveedor);
    printf ("costo             : %g\n", datum->costo);
    printf ("venta             : %g\n", datum->venta);
    printf ("impuestos         : %g\n", datum->impuestos);
    printf ("cantidad existente: %d\n", datum->cantidad_existente);
    putchar ('\n');
    (*counter)++;
}

void print_on_file (Producto *datum, FILE *file_stream)
{
    fprintf (file_stream, "%s\t", datum->codigo_de_barras);
    fprintf (file_stream, "%s\t", datum->descripcion);
    fprintf (file_stream, "%s\t", datum->proveedor);
    fprintf (file_stream, "%g\t", datum->costo);
    fprintf (file_stream, "%g\t", datum->venta);
    fprintf (file_stream, "%g\t", datum->impuestos);
    fprintf (file_stream, "%d\n", datum->cantidad_existente);
}

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;
}

float read_decimal (const char *message)
{
    float decimal_var;
    printf ("%s: ", message);
    scanf ("%f", &decimal_var);
    (void) getchar();
    return decimal_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