• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Cypher

Enviar shorts para o ficheiro

9 mensagens neste tópico

Bem tenho aqui uma duvida....

das maneira que vi nos livros, e de uma rapida pesquisa que fiz na net tentei procurar as varias maneiras de escrever num ficheiro... e a maioria era em char ou int ... não existe nenhuma maneira de meter em short ??

eu tento enviar desta maneira e enviame os 2 bytes correspondestes ao unsigned short ou short...

por exemplo se fizer esta instruçao 6 vezes

fprintf(fp,"%hu",bit);

que daria um total de 6*2(short)=12 bytes, mas em vez dos 12 tal como pretendia dame 16 bytes...  :rant_01:

ideias ??

Cumps...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes usar packed structures.... Funciona na memória, agora no disco não sei como trabalha......

EDIT:

Não sei porque respondi isto.... Mas pronto.... Eu fiz isto:

#include <stdio.h>

int main()
{
    short int thing = 10;
    FILE* store = fopen("store", "w");
    //fwrite(&thing, 2, 1, store);
    fprintf(store, "%d", thing);
    return (0);
}

Com fwrite não funciona.... Pelo menos não consigo ver o "10" no ficheiro, mas nunca usei o fwrite, provavelmente estou a usá-lo incorrectamente....

Com qualquer das operações o GNOME diz-me que o ficheiro store tem 2 bytes, e se faço "du -b store" diz-me o mesmo.... Julgo que o ficheiro tenha mesmo 2 bytes...... xD

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este exemplo produz um ficheiro com 12 bytes:

#include <stdio.h>

int main(int argc, char *argv[]){

FILE *fp;
unsigned short val1 = 0x55AA;

if( (fp = fopen("cypher.txt", "wb")) != NULL){

	fwrite(&val1, sizeof(unsigned short), 1, fp);
	fwrite(&val1, sizeof(unsigned short), 1, fp);
	fwrite(&val1, sizeof(unsigned short), 1, fp);

	fwrite(&val1, sizeof(unsigned short), 1, fp);
	fwrite(&val1, sizeof(unsigned short), 1, fp);
	fwrite(&val1, sizeof(unsigned short), 1, fp);

	fclose(fp);
}else{
	printf("Error\n");
};
return 0;
};

Espero ter ajudado.

Cumprimentos :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora é isso mesmo....  :D:P:D:thumbsup: O0 :notworthy: lol

podes so me explicar porque é que tem o & antes do val1 no fwrite ??

cumps...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora é isso mesmo....  :D:P:D:thumbsup: O0 :notworthy: lol

podes so me explicar porque é que tem o & antes do val1 no fwrite ??

cumps...

size_t                          // (return) total de elementos escritos com sucesso
    fwrite( const void * ptr,   // (arg #1) pointer para o (array de) elemento(s) a escrever
            size_t size,        // (arg #2) tamanho de cada elemento a escrever
            size_t count,       // (arg #3) numero de elementos a escrever
            FILE * stream );    // (arg #4) pointer para a stream de escrita

como val1 não era um pointer para um elemento, teve de se "de-referenciar"... Com o fp não foi preciso porque já era um pointer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E utilizando o fread... tal como o fwrite escrevia 2bytes ... agora fiz assim com o fread para ler os 2 bytes...

	if( (fp = fopen("cypher.txt", "r")) != NULL){

	fread(&val1, sizeof(unsigned short), 1, fp);
	fclose(fp);
}else
	printf("Error\n");

mas assim so leio um caracter ja tentei usar o while e meter != EOF... mas nao estou a conseguir lê los a todos... os caracteres... como é que eu posso ler e fazer por exmplo um printf ou qualquer coisa ??

cumps...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que nao deve ser necessario abrir outro topico a perguntar como se recebe os short ou 16 de um ficheiro...porque é a duvida que tenho agora aqui xd...

cumps...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Veja com atenção.

#include <stdio.h>
#include <io.h>

int main(){

FILE *fp;
unsigned short val1;
unsigned short val2[] = {0xCAFE, 0xBABE, 0x55AA, 0x6718, 0x300D, 0xC4A0};
unsigned long i;

printf("Unsigned short: %d bytes.\n", sizeof(unsigned short));

if( (fp = fopen("cypher.txt", "wb")) != NULL){

	fwrite(val2, sizeof(unsigned short), 6, fp);
	/* Ou:
		fwrite(&val2[0], sizeof(unsigned short), 6, fp);

	   Se por exemplo quiser escrever so os 3 ultimos valores da array:

		fwrite(&val2[3], sizeof(unsigned short), 3, fp);
	*/

	fclose(fp);
}else{
	printf("Error\n");
};
if( (fp = fopen("cypher.txt", "rb")) != NULL){

	unsigned long filesize = filelength(fileno(fp));
	printf("File size %ld bytes.\n", filesize);

	for(i = 0; i < (filesize/sizeof(unsigned short)); i++){
		fread(&val1, sizeof(unsigned short), 1, fp);
		printf("--0x%hX\n", val1);
	};
	/* Pode ler tambem os 12 bytes directamente.
	   La em cima mude unsigned int val1 para val1[6].

		fread(val1, sizeof(unsigned short), 6, fp);
		for(i=0;i<6;i++){
			printf("--0x%hX\n", val1[i]);
		};
	*/

	fclose(fp);
}else{
	printf("Error\n");
};
return 0;
};

Cumprimentos :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

como val1 não era um pointer para um elemento, teve de se "de-referenciar"... Com o fp não foi preciso porque já era um pointer.

Só uma correcçãozinha... desreferenciar é com *, & é o operador referência. Por isso... seria referenciar ::D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora