Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

220
Visualizações
¿Por qué C usa 5 bytes para escribir/escribir el número 10, pero 4 bytes para escribir 9 u 11?

CCG en Windows

 #include <stdio.h> #include <stdlib.h> struct test { int n1; int n2; }; int main() { FILE *f; f = fopen("test.dat", "w"); struct test test1 = {10, 10}; fwrite(&test1, sizeof(struct test), 1, f); fclose(f); struct test test2; f = fopen("test.dat", "r"); while(fread(&test2, sizeof(struct test), 1, f)) printf("n1=%d n2=%d\n", test2.n1, test2.n2); fclose(f); return 0; }

Si configuro test1 en 10,10 , entonces fwrite escribirá 10 bytes en el archivo: 0D 0A 00 00 00 0D 0A 00 00 00

(cada int de 4 bytes se rellenará con un carácter de retorno de carro 0D antes)

Si configuro test1 en 11,11 , entonces fwrite escribirá 8 bytes en el archivo: 0B 00 00 00 0B 00 00 00

(como era de esperar)

Si configuro test1 en 9,9 , fwrite escribirá 8 bytes en el archivo: 09 00 00 00 09 00 00 00

(como era de esperar)

Si configuro test1 en 9,10 , fwrite escribirá 9 bytes en el archivo: 09 00 00 00 0D 0A 00 00 00

El 9 obtiene 4 bytes como se esperaba, pero el 10 se rellena con un byte 0D adicional, lo que da como resultado 5 bytes. ¿Qué tiene de especial el número 10 que requiere este relleno? ¿Y por qué los números más pequeños y más grandes (8, 9, 11, 12, 13, 14, etc.) no se rellenan? Pensé que tal vez GCC estaba confundiendo el número 10 con un carácter de nueva línea (una nueva línea es 10 es acsii), pero esto no explica cómo fread puede recuperar el número 10 correctamente.

¿Y cómo escribo una estructura para archivar sin obtener este relleno adicional en el número 10?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Abrió el archivo en modo de texto , por lo que en Windows cada carácter '\n' tiene un retorno de carro antepuesto.

Debería escribir (y leer) datos binarios en modo binario ( fopen(..., "wb") ) -- esto será mucho más rápido y evitará sorpresas (y también requiere solo 8 bytes, que es el tamaño de sizeof(struct test) es).

¿Qué tiene de especial el número 10 que requiere este relleno?

El número 10 resulta ser el código ASCII para un carácter de nueva línea ( '\n' ).

over 4 years ago · Santiago Trujillo Relatório

0

Está escribiendo y leyendo en modo texto.

Abra el archivo con las banderas "wb" y "rb". Esto tratará los archivos como archivos binarios.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda