Lettura/scrittura (binario) su un FILE

di il
6 risposte

Lettura/scrittura (binario) su un FILE

Ciao, io ho fatto questo esercizio:
La funzione accetta in input due stringhe C. La prima contiene il nome di un file da aprire in modalità lettura non tradotta (binaria). Se il file esiste si deve creare in modalità scrittura tradotta (testo) un file utilizzando il nome passato come secondo parametro.La funzione deve scrivere in output per ogni byte del file di input la sua rappresentazione in base 2 in formato testo utilizzando i caratteri ‘0’ e ‘1’ e dopo ogni byte scritto inserire uno spazio. Ogni 8 byte così scritti si deve inserire un carattere <a capo>. Ad esempio, se abbiamo un file che contiene 2 byte che valgono 171 e 205 deve produrre un file contenente:
10101011 11001101
Se il file di input non contiene byte, anche il file di output sarà vuoto. Se invece non è possibile aprire il file di input (ad esempio, perché non esiste) non si creerà neppure il file di output.

questo è il main.c:
#include "bynary.h"

int main(){

	FILE *f = fopen("leggo.bin", "wb");
	if (f == NULL){
		return EXIT_FAILURE;
	}

	double vet[] = {0,1,2,3,4,5,6,7,8,9};

	fwrite(vet, sizeof(double), 10, f);

	fclose(f);

	stampa_binario("leggo.bin", "scrivo.bin");


	return 0;
}
questo il file.h:
#if !defined BINARY_H
#define BINARY_H
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>


extern void stampa_binario(const char *filename_in, const char* filename_out);



#endif
questo è il file.c:
#include "bynary.h"

unsigned char *converti_bin(unsigned char num){
	unsigned char *ret = malloc(9 * sizeof(char));
	for (int i = 7; i >= 0; i--){
		if (num % 2 == 0){
			ret[i] = '0';
		}
		else
			ret[i] = '1';
		num /= 2;
	}


	ret[8] = '\0';

	return ret;
}

void stampa_binario(const char* filename_in, const char* filename_out){
	FILE *fin = fopen(filename_in, "rb");
	if (fin == NULL){
		return;
	}

	FILE *fout = fopen(filename_out, "wt");
	unsigned char *buffer = malloc(8 * sizeof(char));

	while (1){
		int in = 0;
		size_t val = fread(buffer, 1, 8, fin);
		if (ferror(fin))
			break;
		for (size_t i = 0; i < val; ++i){
			unsigned char *s = converti_bin(buffer[i]);
			in = fprintf(fout, "%s ", s);
			free(s);
}
		if (feof(fin))
			break;
		in = fprintf(fout, "\n");

	}

	free(buffer);
	fclose(fin);
	fclose(fout);


}
Sono sicurissimo che il file.c sia corretto, però non capisco perchè utilizzando un editor non mi viene scritto esattamente quello che dovrei leggere o scrivere nel file. Il problema secondo me è nel main, qualcuno ha capito cosa sia?

6 Risposte

  • Re: Lettura/scrittura (binario) su un FILE

    Ma cosa viene scritto?
  • Re: Lettura/scrittura (binario) su un FILE

    Mi viene questo:
    30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 0D 0A 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 31 31 31 31 30 30 30 30 20 30 30 31 31 31 31 31 31 20 0D 0A 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 31 30 30 30 30 30 30 20 0D 0A 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 31 30 30 30 20 30 31 30 30 30 30 30 30 20 0D 0A 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 31 30 30 30 30 20 30 31 30 30 30 30 30 30 20 0D 0A 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 31 30 31 30 30 20 30 31 30 30 30 30 30 30 20 0D 0A 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 31 31 30 30 30 20 30 31 30 30 30 30 30 30 20 0D 0A 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 31 31 31 30 30 20 30 31 30 30 30 30 30 30 20 0D 0A 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 31 30 30 30 30 30 20 30 31 30 30 30 30 30 30 20 0D 0A 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30 30 31 30 30 30 31 30 20 30 31 30 30 30 30 30 30 20 0D 0A
  • Re: Lettura/scrittura (binario) su un FILE

    Scusa ... noi non conosciamo tutta la questione ...

    Per facilitare ...

    COSA dovrebbe esserci? E invece COSA c'è?
  • Re: Lettura/scrittura (binario) su un FILE

    Io nel main ho un vettore con elementi che vanno da 0 a 9.
    Quindi scrivo nel file di lettura gli elementi. Poi il programma dovrebbe leggere gli elementi, convertirli in binario e scriverli nell'altro file. In teoria dovrei ottenere scritto questo: 00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001

    ma invece ottengo quello che ho scritto nel messaggio precedente. perchè mi avviene questo?
  • Re: Lettura/scrittura (binario) su un FILE

    Mi sembra sia corretto ... Scrivi dei double nel primo file quindi, rileggendo 8 byte alla volta, avrai 8 byte della rappresentazione in virgola mobile.

    Se vuoi leggere quello che pensi di leggere, allora devi scrivere dei valori "unsigned char" non "double" e leggere un byte alla volta non 8.
  • Re: Lettura/scrittura (binario) su un FILE

    Adesso ho capito, grazie mille!
Devi accedere o registrarti per scrivere nel forum
6 risposte