#10 richard.zavodny
Váš program je samozřejmě špatně, protože si po průběhu prvního cyklu přenastavíte ukazatel na buffer fileContent na literál "", který je ovšem uložený v paměti, která je pouze pro čtení. Proto segment violation. Čištění fileContent na konci cyklu úplně zrušte, protože následující read vám jeho obsah stejně přepíše.
Mimochodem i řádka
cout << fileContent << " - ";
je špatně, protože vyžaduje, aby obsah fileContent byl ukončený nulou. Takže pokud vám to funguje, tak pouze náhodou, že zrovna za bufferem v paměti je nula.
Na konci programu vám chybí delete [] fileContent; aby se uvolnila alokovaná paměť. Osobně bych vám doporučil buffer o 3 znacích nealokovat na haldě, ale jednoduše ho udělat rovnou na zásobníku:
char fileContent[3];
C předává pole do funkcí jako ukazatel na první prvek, takže proměnnou fileContent můžete rovnou dát jako argument funkce read i jako argument funkce base64Encode (tady se ale možná bude mlátit char a unsigned char a bude potřeba přetypování).
Anebo, když jsou ty Vánoce, tak tady je řešení, které jsem navrhoval já:
#include <assert.h>
#include <iostream>
#include <stdint.h>
namespace {
const char base64_table[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
} /* -- namespace */
class Encoder {
private:
uint8_t ochunk[4];
int oindex;
public:
Encoder();
void encode(
uint8_t byte_,
std::ostream& os_);
};
Encoder::Encoder() :
oindex(0) {
}
void Encoder::encode(
uint8_t byte_,
std::ostream& os_) {
switch(oindex) {
case 0:
ochunk[3] = (byte_ & 0xfc) >> 2;
ochunk[2] = (byte_ & 0x3) << 4;
break;
case 1:
ochunk[2] |= (byte_ & 0xf0) >> 4;
ochunk[1] = (byte_ & 0xf) << 2;
break;
case 2:
ochunk[1] |= (byte_ & 0xc0) >> 6;
ochunk[0] = (byte_ & 0x3f);
/* -- write data */
os_.put(base64_table[ochunk[3]]);
os_.put(base64_table[ochunk[2]]);
os_.put(base64_table[ochunk[1]]);
os_.put(base64_table[ochunk[0]]);
break;
default:
assert(false);
break;
}
oindex = (oindex + 1) % 3;
}
int main(
int argc_,
char* argv_[]) {
Encoder encoder_;
int c_;
while((c_ = std::cin.get()) != std::char_traits<char>::eof()) {
encoder_.encode(static_cast<uint8_t>(c_), std::cout);
}
return 0;
}
Je potřeba ještě dopsat funkci close, která vám zarovná výstup na konci - pokud vstup není násobek 3, tak se do výstupu přidávají zarovnávací znaky =. (Mimochodem, tohle neřeší ani váš program.) A samozřejmě by to chtělo ošetřit chyby. Ale to, doufám, případně už zvládnete sám.