PDA

View Full Version : [c++]fwrite, perke scrive in binario e non in ascii ?


LNdemon
06-09-2005, 12:43
come da titolo, faccio un semplice fwrite:

FILE *fp ;
int x = 100 ;
fp = fopen ( "output.txt" , "w" ) ;
fwrite ( &x , sizeof ( int ) , 1 , fp ) ;
fclose ( fp ) ;

funziona perfettamente, solo un problema, nel file scrive in binario e non in ascii , perke ? :(

ilsensine
06-09-2005, 13:42
Non scrive né binario né ascii, scrive semplicemente il numero di byte che specifichi.
Non ha una sfera di cristallo per sapere che stai scrivendo un "int" invece che - ad es. - un "float" ;)

LNdemon
06-09-2005, 14:10
capito. Come faccio a scrivere un file in ascii ? :D

ilsensine
06-09-2005, 15:00
Qualcosa tipo:
char buf[16];
sprintf(buf, "%d", x);
fwrite(buf, strlen(buf), 1, fp);

In c++ credo che puoi usare gli stream per semplificarti il lavoro ed evitare buffer temporanei. Esistono anche simili soluzioni in c (ad es. la dprintf dei sistemi GNU), ma non sono standard.

cionci
07-09-2005, 00:05
Allora potresti usare direttamente fprintf ;)

ilsensine
07-09-2005, 07:14
Allora potresti usare direttamente fprintf ;)
Ouch! :stordita:

fantoibed
07-09-2005, 08:23
In alternativa:#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
#include <stdlib.h>

int main()
{
ofstream fp;
int x = 100;
char buffer[(sizeof(int)*8+1)];

fp.open("output.txt", ios::out);

fp<<"Binario:"<<itoa(x, buffer, 2)<<endl;
fp<<"Decimale:"<<itoa(x, buffer, 10)<<endl;
fp<<"Esadecimale:"<<itoa(x, buffer, 16)<<endl;

fp.close();

return 0;
}

Qu@ker
07-09-2005, 08:41
Oppure:

#include <iostream>
#include <iomanip>
#include <bitset>

int main(void)
{
int x = 100;

std::cout << x << std::endl;
std::cout << std::hex << x << std::endl;
std::cout << std::bitset<8>(x) << std::endl;
}

cionci
07-09-2005, 08:48
Lo vedo meglio senza buffer ;)

fp<<"Binario:"<<itoa(x, buffer, 2)<<endl;
fp<<"Decimale:"<<itoa(x, buffer, 10)<<endl;
fp<<"Esadecimale:"<<itoa(x, buffer, 16)<<endl;


A parte la base 2, si può usare setbase di iomanip per ottenere i vari formati...fa molto più C++ :)

cout << "Base 8: " << setw(10) << setbase(ios::oct) << x << endl;
cout << "Base 16: " << setw(10) << setbase(ios::hex) << x << endl;
cout << "Base 10: " << setw(10) << setbase(ios::dec) << x << endl;

cionci
07-09-2005, 08:50
Mi vado a studiare quel bitset che non l'ho mai usato ;) Apriamo lo stroustrup :D

fantoibed
07-09-2005, 09:14
Oppure:fp<<"Esadecimale: "<<hex<<x<<endl

Ci stiamo prendendo gusto, eh! :p

DanieleC88
07-09-2005, 10:43
Ouch! :stordita:
Capita anche ai migliori... :D