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?