Jump to content

Enviar shorts para o ficheiro


Cypher
 Share

Recommended Posts

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...  ?

ideias ??

Cumps...

Link to comment
Share on other 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

Link to comment
Share on other 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 🙂

Link to comment
Share on other sites

Ora é isso mesmo....  😄😛😄👍 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.

Link to comment
Share on other 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...

Link to comment
Share on other 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 😄

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.