Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

179
Vistas
No se imprime cuando se usa fgets

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 ")

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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);
over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda