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"
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
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é.