Зачем C ++, создавать файл Unicode, если вы пытаетесь записать такую структуру в файл?
Часть кода:
struct stEjemplo
{
char cadena1[9];
char cadena2[9];
};
Напишите, что я пишу в cadena1, и cadena2 показывает мне что-то вроде этого в файле:
㈱㐳㘵㠷㠀㘷㐵㈳o
Пример:
fstream file("File.dat");
if(!file.is_open())
{
file.open("File.dat", ios::in | ios::out | ios::trunc);
}
stEjemplo somest = {0};
strcpy(somest.origen, "SomeText");
strcpy(somest.destino, "SomeText");
file.clear();
file.seekg(0,ios::beg); //ios::end if existing information
file.write(reinterpret_cast< char*>(&somest), sizeof(stEjemplo));
file.close();
Результаты этого:
潓敭敔瑸匀浯呥硥t
Обратите внимание на «t» в финале (это «t» в финале второго «SomeText»)
Но если бы моя структура была:
struct stEjemplo
{
int number; //then I assign 1324
char cadena1[9];
char cadena2[9];
};
Результаты: , SomeText SomeText
или же
struct stEjemplo
{
bool x; //then I assign true o false
char cadena1[9];
char cadena2[9];
};
приведет что-то вроде: SomeText SomeText
РЕДАКТИРОВАТЬ:
Если 00 (символ NULL) в шестнадцатеричном редакторе установлен в нечетной позиции (начиная с 0, например: 1, 3, 5, 7, 9 и т. Д. И т. Д.), У меня проблема, но если 00 установлено в паре позиции и не предшествует еще 00, проблема решена.
Известная ошибка Блокнота. Не твоя вина.
Вы открываете File.dat
в вашем текстовом редакторе, как UTF-16LE, если это не так, откройте его в простом ASCII или UTF-8 (или даже используйте шестнадцатеричный редактор), и вы должны увидеть строки.
Corresponds 敭 敔 瑸 匀 呥 硥 t соответствует последовательности UTF-16LE
53 6F 6D 65 54 65 78 74 00 53 6F 6D 65 54 65 78 74 00
угадайте, что это, когда читается как обычный ASCII / UTF-8?
Это плохой способ обработки вещей. Это может даже быть неопределенное поведение (из-за заполнения членов структуры).
Было бы лучше написать код сериализации для вашей структуры:
#include <cstring>
#include <fstream>
#include <iostream>
struct stEjemplo
{
char cadena1[9];
char cadena2[9];
};
std::ostream& operator<<(std::ostream& os, const stEjemplo& e)
{
return os << e.cadena1 << ' ' << e.cadena2;
}
int main()
{
stEjemplo somest = {};
std::strcpy(somest.cadena1, "SomeText");
std::strcpy(somest.cadena2, "SomeText");
std::ofstream file("File.dat", std::ios::trunc);
if(!file)
{
std::cout << "Failed opening file.\n";
}
file << somest;
file.close();
// no error checking, assuming all will go well
std::ifstream test("File.dat");
std::string contents;
std::getline(test, contents);
std::cout << contents;
}
Также:
std::string
вместо char[]
а также strcpy
,std::ios::binary
при записи сырых данных, таких как закодированные строки.