std::string hexString = "0xBAADF00D";
char octString[MAX_BUF];
itoa(std::stoi(hexString, 0, 16 ), octString, 8);
#include <cstring>
#include <iostream>
unsigned getHexDigit(char hexChar)
{
if (hexChar >= '0' && hexChar <= '9')
{
return hexChar - '0';
}
if (hexChar >= 'A' && hexChar <= 'F')
{
return 10 + hexChar - 'A';
}
if (hexChar >= 'a' && hexChar <= 'f')
{
return 10 + hexChar - 'a';
}
return 0;
}
void getOctQuartet(const char* hex, char* oct)
{
unsigned number = getHexDigit(hex[0]) << 8 | getHexDigit(hex[1]) << 4 | getHexDigit(hex[2]);
oct[0] = '0' + (number >> 9 & 07);
oct[1] = '0' + (number >> 6 & 07);
oct[2] = '0' + (number >> 3 & 07);
oct[3] = '0' + (number & 07);
}
char* getOctString(const char* hexString)
{
const size_t hexStrLen = strlen(hexString);
const size_t prefixLen = hexStrLen % 3;
char* octString = new char[(hexStrLen - prefixLen + 3) / 3 * 4 + 1];
char* pOct = octString;
if (prefixLen > 0)
{
char hexPrefix[3] = { '0'
, prefixLen == 2 ? hexString[0] : '0'
, prefixLen == 2 ? hexString[1] : hexString[0]
};
getOctQuartet(hexPrefix, octString);
pOct += 4;
}
const char* pHex = hexString + prefixLen;
while(pHex < hexString + hexStrLen)
{
getOctQuartet(pHex, pOct);
pHex += 3;
pOct += 4;
}
*pOct = '\0';
return octString;
}
int main()
{
char hexString[] = "123456789ABCDEF";
char* octString = getOctString(hexString);
std::cout << octString << std::endl;
delete[] octString;
return 0;
}
std::string decString("10");
std::stringstream buf;
buf << std::oct << std::stoi(decString) << std::endl;
std::string octString = buf.str();
std::cout << octString << std::endl;
protected:
char* Str; // first
int Length; // second
String::String(const char* ptr)
: Str(new char[strlen(ptr) + 1]), Length(strlen(ptr) + 1)
{
strcpy(Str, ptr);
}
String::String(const String& t)
: Str(new char[t.Length]), Length(t.Length)
{
strcpy(Str, t.Str);
}
protected:
int Length; // first
char* Str; // second
только символы '0', '1', '2', '3', '4', '5','6', '7', '8', '9', 'A, 'B', 'C', 'D', 'E', 'F'.
//...
struct hex_str_traits
{
static bool is_hex_chars(const char* s)
{
auto size{ strlen(s) };
for (auto idx{ 0 }; idx < size; ++idx)
{
if (!in_range(s[idx], '0', '9') && !in_range(s[idx], 'A', 'F'))
return false;
}
return true;
}
static bool in_range(const int& value, const int& a, const int& b)
{
return a <= value && value <= b;
}
};
//...
class hex_string : public String
{
//...
public:
hex_string(const char* s);
//...
};
//...
hex_string::hex_string(const char* s)
: String( (hex_str_traits::is_hex_chars(s) ? s : "") )
{
}
//...
cout << "Введите номер строки, которую Вы хотите отредактировать: ";
cin >> n;
cout << "Введите фамилию участника: ";
cin >> SP[n - 1].Name;
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using std::ofstream;
using std::vector;
using std::string;
using std::cout;
using std::cin;
using std::endl;
class Sport
{
vector<Sport> Sp;
char team;
double bal;
unsigned mesto;
string name;
public:
Sport(string _name = {}, char _team = {}, double _bal = {},
unsigned _mesto = {}, vector<Sport> sp = {})
: name {_name}, team{_team}, bal{_bal},
mesto{_mesto}, Sp{sp} {}
private:
friend ofstream& operator<<(ofstream& ofs, Sport& sp);
};
ofstream& operator<<(ofstream& ofs, Sport& sp)
{
ofs << sp.name << ' ';
ofs << sp.team << ' ';
ofs << sp.mesto << ' ';
ofs << sp.bal << ' ';
ofs << endl;
for(auto& p : sp.Sp)
{
ofs << p;
}
return ofs;
}
void writeSportsTo(const char* filename, Sport& sp)
{
ofstream of(filename);
if(of)
{
of << sp;
of.close();
}
}
int main()
{
constexpr char* filename = "C:\\sports.txt";
Sport sp;
writeSportsTo(filename, sp);
return 0;
}
Sport
.vector
и string
. Благодаря этому объект имеет многомерное представление в памяти и вам необходимо придумать, как спроецировать его на "плоскую" память, записать его почленно. Если с char
, int
, float
все очевидно (их размеры известены на этапе компиляции: sizeof(char)
, sizeof(int)
, sizeof(float)
), то для string
, например, нужно сначала сохранить его размер (чтобы потом знать, сколько читать из файла), а потом записать содержимое. С vector
- аналогично, за тем исключением, что это тот же Sport и вам нужно вызвать функцию сохранения для каждого ребенка текущего объекта (и для их детей, т.е. рекуррентно обойти дерево владения).