我有这个功能在.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");
}
}
}
}
答案 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:
array
indexToDelete
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");
}
}