C ++ создает файл в Unicode вместо Ansi

Зачем 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, проблема решена.

0

Решение

Другие решения

Вы открываете 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?

3

Это плохой способ обработки вещей. Это может даже быть неопределенное поведение (из-за заполнения членов структуры).

Было бы лучше написать код сериализации для вашей структуры:

#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 при записи сырых данных, таких как закодированные строки.
0