Если каждый код ascii представлен ровно 3 цифрами, мы можем сделать это довольно легко с помощью цикла:
std::string toAscii(char const* digits, size_t size) {
std::string output(size / 3, '\0');
for(char& c : output) {
char d0 = *digits++; // Get 3 digits
char d1 = *digits++;
char d2 = *digits++;
int ascii_value = (d0 - '0') * 100 + (d1 - '0') * 10 + (d2 - '0');
c = (char)ascii_value;
}
return output;
}
Пример использования
У меня есть c-строка с примеромinput, а также строка с ожидаемым выводом.Эта программа проверяет, что они равны.
int main() {
auto&& input = "126022034056098012";
std::string expected_output = {char(126), char(22), char(34), char(56), char(98), char(12)};
std::cout << (toAscii(input, sizeof(input)) == expected_output); // Prints true
}
Добавляет ли fstream.write () '\ 0' в конец файла?
Нет. Если ваша строка содержит символ 0, онадобавлю, но не иначе.Мы можем проверить это сами с помощью небольшого примера кода.
#include <fstream>
#include <iostream>
#include <string>
int main()
{
{
std::ofstream file("test.txt");
std::string message = "Hello!";
file.write(message.data(), message.length());
// file gets closed automatically
}
{
std::ifstream file("test.txt");
while (file)
{
std::cout << file.get() << '\n';
}
// file gets closed automatically
}
}
Когда я компилирую и запускаю этот код, он выдает следующее.Каждое значение соответствует значению соответствующего символа в "Hello!"
, за исключением последнего.-1
указывает, что вы достигли конца файла, но если бы вы использовали метод, подобный file.read
, он не отобразился бы.\0
не отображается нигде в файле.
72
101
0
108
111
33
-1