如何在.txt C中删除数组中的项目

时间:2018-03-18 21:00:54

标签: c

我有这个功能在.txt上添加客户端但现在我想删除你放的人。 我想通过数组来查找在“removeClient”函数中输入的客户端 The full code is here: https://pastebin.com/xaJ61THK

添加客户的功能是:

void aniadirCliente()
{

    if(clientes[n].dni[0]=='\0'){
        printf("\nIntroduce el nombre del archivo: \nNombre por defecto: clientes.txt\n\n");
        gets(nom_archivo);
        fflush(stdin);
        //Cuando abrimos el fichero le tenemos que poner rw para que podamos escribir y leer.
        archivo=fopen(nom_archivo,"rw");
        if ((archivo = fopen(nom_archivo, "rw")) == NULL) {
            fprintf(stderr, "\n\nEl archivo no existe.");
            system("cls"); //En windows limpia pantalla
        }else
        {
            int i;
            printf("\n\nArchivo cargado correctamente.|\n");
            for(i=0; i<max_clientes;i++){
                fscanf(archivo,"\n %s %s %s %s",clientes[i].dni,clientes[i].nombre,clientes[i].apellidos,clientes[i].direccion);
            }
            for(i=0;i<max_clientes;i++)
            {
                if(clientes[i].dni[0]=='\0')
                {
                    //Crear un nuevo cliente, lo mismo que antes los espacios con _
                    puts("DNI:");
                    scanf("%s", &clientes[i].dni);
                    fprintf(archivo, "%s", clientes[i].dni);

                    puts("Nombre:");
                    scanf("%s", &clientes[i].nombre);
                    fprintf(archivo, "%s", &clientes[i].nombre);

                    puts("Apellidos:");
                    scanf("%s", &clientes[i].apellidos);
                    fprintf(archivo, "%s", &clientes[i].apellidos);

                    puts("Direccion:");
                    scanf("%s", &clientes[i].direccion);
                    fprintf(archivo, "%s", &clientes[i].direccion);
                    break;
                }
            }
        }

}
            fclose(archivo);
            system("cls");

}

删除客户端的功能。 ¿我怎么能删除所有这个客户?:clientes [i] .dni,clientes [i] .nombre,clientes [i] .apellido,clientes [i] .direccion。

void eliminarCliente(){

 if(clientes[n].dni[0]=='\0')
        {
            printf("\nIntroduce el nombre del archivo: \nNombre por defecto: clientes.txt\n\n");
            fflush(stdin);
            gets(nom_archivo);
            //Cuando abrimos el fichero le tenemos que poner rw para que podamos escribir y leer.
            archivo=fopen(nom_archivo,"rw");
            if ((archivo = fopen(nom_archivo, "rw")) == NULL) {
                fprintf(stderr, "\n\nEl archivo no existe.");
            }else{
                int i, y;
                char delcliente;
                for(i=0; i<max_clientes;i++){
            fscanf(archivo,"\n %s %s %s %s",clientes[i].dni,clientes[i].nombre,clientes[i].apellidos,clientes[i].direccion);
        }
                printf("Introduce el dni del cliente que deseas eliminar");
                scanf("%s", &delcliente);
                if(delcliente==clientes[i].dni){

                    printf("Cliente Eliminado");
                    //How to delete all of the client
                }
                else{
                    printf("El dni introducido no coincide");
                }

                }
        }


}

2 个答案:

答案 0 :(得分:0)

从堆栈分配的数组中“删除”一个元素实际上只是覆盖它并将未来的元素转回一个。为此,您需要memmove

/* delelem: Removes element at zero-based index at from array array of 
   size size */
void delelem(int *array, size_t size, int at)
{
    if (at < size-1)
        memmove(&array[at], &array[at+1], 
                ((size - 1) - at) * sizeof(array[0]));
    array[size - 1] = 0; /* use 0 to denote an empty element. In order for
                            this to work, use memset to zero out the array 
                            when it is first created */
}

重写此代码以使用客户端对象是微不足道的。

答案 1 :(得分:0)

If you want delete an element of an array using static memory, you need three things:

  • First: You must know name of your array. In this example, array will be stored in var array
  • Second: You must know index of the element you wanna delete, in the example will stored in var indexToDelete
  • Third: Length of the array, in the example will stored in var arrayLength

Once known this, you need implement next loop:

for (i = indexToDelete; i < arrayLength - 1; i++) {
    array[i] = array[i+1];
}

This loop will go over element to element since the index you wanna delete (i = indexToDelete) up to the total lenght of the array minus one (i < arrayLenght - 1). This minus one is because of you are copying in element i the element i+i so maximum lenght of the loop must be arrayLenght - 1 as we set up.

Currently, array[arrayLength] = array[arrayLength-1] due to the previously implemented loop. So, finally, we need to delete last item (array[arrayLength]). To do that:

clientes[arrayLength].dni[0] = '\0';
clientes[arrayLength].nombre[0] = '\0';
clientes[arrayLength].apellidos[0] = '\0';
clientes[arrayLength].direccion[0] = '\0';

Once done all that, you will have removed your item successfuly.


EXTRA:

Extrapolating all this to your code would be something such that:

// You need correct this things: 

// delcliente is an array of chars, not a only char
char delcliente[9+1]; // DNI has 8 numbers, 1 letter, and '\0' character = Length 10

printf("Introduce el dni del cliente que deseas eliminar");
gets(delcliente); // User input a DNI to remove

// Go over all clientes
for (i = 0; i < max_clientes; i++) {
    // To compare string we use strcmp() 
    if(strcmp(delcliente, clientes[i].dni) == 0) {

        //How to delete all of the client
        for (j = i; j < max_clientes - 1; j++) {
            array[j] = array[j+1];
        }

        clientes[max_clientes].dni[0] = '\0';
        clientes[max_clientes].nombre[0] = '\0';
        clientes[max_clientes].apellidos[0] = '\0';
        clientes[max_clientes].direccion[0] = '\0';

        // Show success message
        printf("Cliente Eliminado");
    }                    
}