Este programa funciona bien para esa tarea hasta ahora. Toda la información está en los comentarios.
Simplemente usa una función más, que se limita a buscar el carácter '\r' o '\n' y lo modifica directamente en la cadena original, cambiándolo por un carácter nulo '\0'. Ni siquiera se necesita malloc para ese pequeño ajuste de cadena.
Simplemente usa una función más, que se limita a buscar el carácter '\r' o '\n' y lo modifica directamente en la cadena original, cambiándolo por un carácter nulo '\0'. Ni siquiera se necesita malloc para ese pequeño ajuste de cadena.
Código [Seleccionar]
#include <stdio.h> //printf, fopen, fgets, fclose
#include <stdlib.h> //exit
#include <string.h> //strlen
int openbin(void);
void striptrail(char *, size_t);
int main(void)
{
openbin();
return 0;
}
int openbin(void)
{
//Definimos el manejador de archivo y nuestro búfer de cadena:
///
FILE *pfile;
char namebin[50];
//Mostramos un mensaje pidiendo un nombre de archivo
//y leemos dicha entrada de usuario con fgets:
///
printf("Nombre de archivo: ");
fgets(namebin,sizeof(namebin), stdin);
//A continuación mostramos el tamaño de la cadena leída
//con fgets, y luego aplicamos la función para eliminar
//nuevas líneas/retornos de carro, para preparar la cadena
//y aprovechamos a mostrar la nueva longitud (si es que se
//ajustó):
///
printf("Longitud de cadena sin procesar: %d\n",strlen(namebin));
//Le pasamos directamente el nombre del búfer de cadena, porque
//este es ya en sí un puntero directo al búfer de cadena:
///
striptrail(namebin, sizeof(namebin));
printf("Longitud de cadena procesada con 'striptrail': %d\n\n",strlen(namebin));
//Tratamos de abrir el archivo. Si no se puede abrir, mostramos
//un error; si se abrió mostramos mensaje de éxito. Después
//cerramos el manejador de archivo y salimos al sistema.
///
if ((pfile = fopen(namebin, "rb"))== NULL)
{
printf("ERROR: No se pudo abrir el archivo.\n");
exit(1);
}
printf("Archivo abierto exitosamente.\n");
fclose(pfile);
return 0;
}
//Esta función simple está pensada para usarse con fgets.
//
//Lo que hace es tomar un puntero a una cadena, y el tamaño
//esperado de la cadena.
//
//Entonces busca un carácter de retorno de carro '\n' o nueva
//línea '\n', introducidos por fgets al presionar ENTER.
//
//NOTA: Si no se encuentra ninguno de esos caracteres, entonces
// el último carácter, al final del búfer de cadena de texto,
// se reemplaza incondicionalmente por un byte nulo '\0' para
// terminar la cadena ASCIIZ, por seguridad.
//
// Es por eso que esta función está diseñada para trabajar con
// fgets u otro código que guarde '\r' o '\n' al final de la
// cadena esperada.
//
///
void striptrail(char * tostrip, size_t sizze)
{
//Tratamos de aplicar optimización de uso de
//registros de CPU, para mayor velocidad para
//el contador del bucle:
///
register size_t x=0;
//Recorremos toda la cadena:
///
for(x=0;x<sizze;x++)
{
//Si el carácter que estamos leyendo actualmente es
//regreso de carro o nueva línea, sabemos que tenemos
//que cambiarlo por el byte nulo '\0' para indicar
//el fin de la cadena. Nos detenemos tan pronto como
//encontremos uno de esos caracteres, regresando de
//la función de inmediato, para evitar seguir escaneando
//la cadena si el objetivo ya está cumplido:
///
if(tostrip[x]=='\r' || tostrip[x]=='\n' || tostrip[x]=='\0')
{
tostrip[x]='\0';
return;
}
}
//Si x tiene el valor del tamaño esperado del búfer,
//reemplazamos el carácter en esa posición con un byte
//nulo para terminar la cadena. Esta línea se puede dejar
//o eliminar dependiendo de cómo funcione nuestro programa,
//y si estamos totalmente seguros de que no necesitamos
//esta "característica de seguridad" (pero vital en este programa):
///
tostrip[x]='\0';
}