Added read/write for float (kind of hacky, assumes IEE)

This commit is contained in:
Dreaded_X 2020-05-06 18:50:48 +02:00
parent ccf0707a0e
commit 7201035a20
3 changed files with 41 additions and 0 deletions

View File

@ -35,6 +35,18 @@ namespace io {
return value; return value;
} }
template <>
float read(std::istream& is) {
union {
uint32_t a;
float b;
} u;
u.a = read_bytes<uint32_t>(is, sizeof(uint32_t));
return u.b;
}
template<> template<>
size_t read(std::istream& is) { size_t read(std::istream& is) {
size_t value = 0; size_t value = 0;

View File

@ -31,6 +31,17 @@ namespace io {
write_bytes(os, value, sizeof(T)); write_bytes(os, value, sizeof(T));
} }
template <>
void write(std::ostream& os, float value) {
union {
uint32_t a;
float b;
} u;
u.b = value;
write_bytes(os, u.a, sizeof(uint32_t));
}
// Special implementation for size_t (also uint64_t, so maybe this is not that smart) // Special implementation for size_t (also uint64_t, so maybe this is not that smart)
template <> template <>
void write(std::ostream& os, size_t value) { void write(std::ostream& os, size_t value) {

View File

@ -74,6 +74,24 @@ int main() {
return io::read<int>(f) == 80085; return io::read<int>(f) == 80085;
}()); }());
Test("Write for float", [] {
std::fstream f("test.bin", std::ios::trunc | std::ios::in | std::ios::out);
io::write<float>(f, 123.654f);
bool succes = 4 == f.tellg(); f.seekg(0); char c;
f.read(&c,1); succes &= (c & 0xff) == 0x42;
f.read(&c,1); succes &= (c & 0xff) == 0xf7;
f.read(&c,1); succes &= (c & 0xff) == 0x4e;
f.read(&c,1); succes &= (c & 0xff) == 0xd9;
return succes;
}());
Test("Read for float", [] {
std::ifstream f("test.bin");
return io::read<float>(f) == 123.654f;
}());
Test("Write for short size_t", [] { Test("Write for short size_t", [] {
std::fstream f("test.bin", std::ios::trunc | std::ios::in | std::ios::out); std::fstream f("test.bin", std::ios::trunc | std::ios::in | std::ios::out);
io::write<size_t>(f, 12); io::write<size_t>(f, 12);