Deveria Funcionar, não? Linguagem C 1

O livro c completo e total poe assim:

"size_t fwrite(void *buffer, size_t num_bytes, size_t count, FILE *fp)

O argumento count determina quantos itens (cada um de comprimento num_bytes) serao … escritos"

[quote=daniloMPA]O livro c completo e total poe assim:

"size_t fwrite(void *buffer, size_t num_bytes, size_t count, FILE *fp)

O argumento count determina quantos itens (cada um de comprimento num_bytes) serao … escritos"
[/quote]

tudo bem danilo, mas segue a documentação pra ver se funciona. Imagino que o pecado esteja no tamanho dos bytes.

Entao num_bytes e o tamanho da unidade, nesse caso o char em bytes. Pode ser que a versao de c++ seja diferente. Mas aqui estou usando c. De qualquer forma nao descartei sua ideia :slight_smile:

Justamente. A gente não leu direito a documentação. Como eu que não li seu código direito.

The GNU C Library Reference Manual:

size_t fwrite (const void *data, size t size, size t count, FILE [Function]
*stream)
This function writes up to count objects of size size from the array data, to the
stream stream. The return value is normally count, if the call succeeds. Any other
value indicates some sort of error, such as running out of space.

Esta funcao escreve ate count objetos de tamanho size a partir do vetor data para a stream stream. Ou seja o mesmo conceito de c completo e total.

Este e a documentacao oficial da libc usada com o gcc.

[quote=daniloMPA]The GNU C Library Reference Manual:

size_t fwrite (const void *data, size t size, size t count, FILE [Function]
*stream)
This function writes up to count objects of size size from the array data, to the
stream stream. The return value is normally count, if the call succeeds. Any other
value indicates some sort of error, such as running out of space.

Esta funcao escreve ate count objetos de tamanho size a partir do vetor data para a stream stream. Ou seja o mesmo conceito de c completo e total.

Este e a documentacao oficial da libc usada com o gcc.[/quote]

tenta com 1 em t_size pra gente ver o resultado

Só para ter um pouco de informação a mais poderia testar o valor retornado pelo fwrite, veja se tem alguma coisa estranha. Se a escrita teve sucesso deverá estar igual ao parâmetro count.

Uma coisa que sempre recomendo a todos que vão ler e escrever arquivos binários é aprender a usar uma ferramenta como o “hexdump” do Linux ou o modo hexadecimal de alguns editores de texto (acho que o Ultraedit e o Notepad++ têm esse modo) para poder ver se você não está fazendo alguma coisa errada. Um exemplo de hexdump sendo rodado sobre um arquivo executável:

0000    4D 5A 90 00 03 00 00 00  04 00 00 00 FF FF 00 00   MZ..............
0010    B8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00   ........@.......
0020    00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
0030    00 00 00 00 00 00 00 00  00 00 00 00 80 00 00 00   ................
0040    0E 1F BA 0E 00 B4 09 CD  21 B8 01 4C CD 21 54 68   ........!..L.!Th
0050    69 73 20 70 72 6F 67 72  61 6D 20 63 61 6E 6E 6F   is program canno
0060    74 20 62 65 20 72 75 6E  20 69 6E 20 44 4F 53 20   t be run in DOS
0070    6D 6F 64 65 2E 0D 0D 0A  24 00 00 00 00 00 00 00   mode....$.......
0080    50 45 00 00 4C 01 05 00  6D 8E 36 33 00 00 00 00   PE..L...m.63....

Você acaba aprendendo muita coisa …

[quote=entanglement]Uma coisa que sempre recomendo a todos que vão ler e escrever arquivos binários é aprender a usar uma ferramenta como o “hexdump” do Linux ou o modo hexadecimal de alguns editores de texto (acho que o Ultraedit e o Notepad++ têm esse modo) para poder ver se você não está fazendo alguma coisa errada. Um exemplo de hexdump sendo rodado sobre um arquivo executável:

0000    4D 5A 90 00 03 00 00 00  04 00 00 00 FF FF 00 00   MZ..............
0010    B8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00   ........@.......
0020    00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
0030    00 00 00 00 00 00 00 00  00 00 00 00 80 00 00 00   ................
0040    0E 1F BA 0E 00 B4 09 CD  21 B8 01 4C CD 21 54 68   ........!..L.!Th
0050    69 73 20 70 72 6F 67 72  61 6D 20 63 61 6E 6E 6F   is program canno
0060    74 20 62 65 20 72 75 6E  20 69 6E 20 44 4F 53 20   t be run in DOS
0070    6D 6F 64 65 2E 0D 0D 0A  24 00 00 00 00 00 00 00   mode....$.......
0080    50 45 00 00 4C 01 05 00  6D 8E 36 33 00 00 00 00   PE..L...m.63....

Você acaba aprendendo muita coisa …[/quote]

Nossa, mas dos mode não acabou no win xp?

Todo arquivo executável do Windows está no formato PE (“Portable Executable Format”) e esse formato é assim: existe um antigo cabeçalho DOS que começa por MZ ( Mark Zbikowski ) que simplesmente, se alguém tentar executar esse arquivo em Windows 3.1 ou DOS, irá imprimir essa mensagem “This program cannot be executed in DOS mode” e sair.
A parte útil começa a partir do ponto em que está escrito “PE” (Portable Executable).

Eu me lembro que o winxp mantinha um modo de compatibilidade com o dos. O win95 e 98 rodavam em cima dele.

Pessoal, descobri o que ocorria - embora não o porquê - mas é o seguinte: quando eu chamo uma função de escrita como fwrite ou putc logo após ter chamado uma de leitura como fread ou getc - isso no modo “w+b” - a função de gravação simplesmente não funcina. E o retorno de fwrite, por exemplo, informa que foram escritas as count unidades. Como resolvi? Usei fseek só para reposicionar logo após a leitura e depois a função de escrita funcionou! Isso acontece com o mingw atual e com o openwatcom. Parece que chamar a função de leitura coloca a stream num modo interno que espera sómente por outra leitura ou simplesmente e inesperadamente impede efetivamente a escrita. Mas, isso deveria ocorrer no modo leitura E escrita? Não sei. Mas fica a experiência. E obrigado pelas mensagens. Até.