Estoy aprendiendo sobre la entrada/salida de archivos en C. Pero hay algo que no entiendo.
Estaba a punto de imprimir la oración simple en [words.txt] usando fgets, pero no funciona.
[palabras.txt] como se muestra a continuación:
This speech caused a remarkable sensation among the party.Y mi código es:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *buffer = malloc(100); memset(buffer, 0, 100); FILE *fp = fopen("words.txt", "r"); fgets(buffer, sizeof(buffer), fp); printf("%s\n", buffer); fclose(fp); free(buffer); return 0; }La salida es "Este sp"
Pensé que no había ningún problema con mi código, pero el resultado de salida fue inesperado.
Quiero decir, ¿por qué no se imprime toda la cadena?
Además, ¿cuál es el motivo de esta cadena de salida?
(Parece que no hay indicios de que este código tenga 7 caracteres, es decir, " Este sp ")
Su búfer se declara como un char* y no como una matriz de tamaño fijo, por lo que sizeof(buffer) es 8, por lo tanto, los 7 caracteres (más un '\0' ) se leen e imprimen. sizeof no sabe cuántos bytes solicitó malloc de todos modos. Creo que esto es lo más confuso cuando comienzas a aprender sobre punteros y te das cuenta de que las matrices funcionan como punteros, pero no del todo.
Solución :
fgets(buffer, 100, fp);O
char buffer[100]; fgets(buffer, sizeof(buffer) fp);Dado que declaró buffer como char *buffer , no es una matriz. En cambio, es simplemente un puntero.
La expresión sizeof buffer evaluará el tamaño del puntero en sí, no el tamaño del objeto al que apunta el puntero. Dado que los punteros suelen tener un tamaño de 32 o 64 bits, la expresión sizeof buffer se evaluará como 4 u 8 . En tu caso, parece ser 8 .
Si hubiera declarado un buffer en lugar de esto
char buffer[100]; entonces buffer no sería un puntero, sino una matriz, y la expresión sizeof buffer se habría evaluado en 100 .
En su caso, no hay nada de malo en usar malloc , en lugar de una matriz. Sin embargo, si usa malloc , debe recordar el tamaño de la memoria asignada usted mismo. No puede usar el operador sizeof para esto.
En lugar de escribir el número 100 en varios lugares de su código, puede usar una macro de preprocesador para esto:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define ALLOCATION_SIZE 100 int main() { char *buffer = malloc( ALLOCATION_SIZE ); memset(buffer, 0, ALLOCATION_SIZE ); FILE *fp = fopen("words.txt", "r"); fgets(buffer, ALLOCATION_SIZE, fp); printf("%s\n", buffer); fclose(fp); free(buffer); return 0; } Esto tiene la ventaja de que si alguna vez decide cambiar el número 100 a algún otro número, solo tiene que cambiar el número en un lugar de su código, en lugar de varios lugares.