5 / 5 / 2
Регистрация: 15.04.2016
Сообщений: 106
1

Как изменить кодировку для записи в файл

27.05.2016, 09:44. Показов 3442. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь записать данные в лог файл.
Параметрами получил
C++
1
String pMessage
Далее
C++
1
2
FILE *LogFile=_tfopen(mLogDirectionFilePath.c_str(),_T("a"));
_ftprintf(LogFile,MessageString.c_str());
В результате в файле "?????? ?????? ?? ???". Каждый из "?" имеет код 3F. Как правильно записать строку в файл?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2016, 09:44
Ответы с готовыми решениями:

Как изменить кодировку при записи в файл
void MainWindow::on_pushButton_3_clicked() { QString fr=...

Как поменять кодировку для записи в файл?
Программа должна создавать bat-файл с командами takeown и icacls. Когда я открываю файл в любом...

Как указать кодировку UNICODE при записи в файл?
Пытался найти разную инфу по поводу записи в файл с определенной кодировкой, однако ни один мне не...

Как задать кодировку при записи в файл или чтения из него
У меня блокнот Notepad++, своей программой я записываю в некоторый текстовый файл все символы...

21
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
27.05.2016, 10:21 2
Taiphoon, как бы
_tprintf and _ftprintf are to be used with TCHAR format strings.
0
5 / 5 / 2
Регистрация: 15.04.2016
Сообщений: 106
27.05.2016, 10:24  [ТС] 3
Так c_str() по идее к нему и должна привести
0
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
27.05.2016, 10:25 4
Taiphoon, у вас XE? что в недрах String? может вам нужно fwprintf?
0
5 / 5 / 2
Регистрация: 15.04.2016
Сообщений: 106
27.05.2016, 10:31  [ТС] 5
Embarcadero® C++Builder 10 Seattle Version 23.0.20618.2753
От дефолтных настроек только отключена опция "classec compiler".
Аналогичный результат дают строки
C++
1
2
_ftprintf(LogFile,(L"Проверка\n"));
_ftprintf(LogFile,_T("Проверка\n"));
Добавлено через 1 минуту
Цитата Сообщение от vxg Посмотреть сообщение
может вам нужно fwprintf?
В заголовках:
C++
1
#define _ftprintf       fwprintf
0
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
27.05.2016, 10:36 6
Taiphoon, попробуйте fwprintf

Добавлено через 11 секунд
оооо

Добавлено через 5 минут
Taiphoon, может уйти от этих функций? чем fprintf плох? там тоже можно вроде выводить широкие
0
5 / 5 / 2
Регистрация: 15.04.2016
Сообщений: 106
27.05.2016, 10:47  [ТС] 7
А как ему скормить String, при этом сохранив зависимость типа от настроек компиляции?
0
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
27.05.2016, 10:49 8
Taiphoon, что значит "сохранив зависимость типа от настроек компиляции"?
0
5 / 5 / 2
Регистрация: 15.04.2016
Сообщений: 106
27.05.2016, 10:55  [ТС] 9
char или wchar_t
0
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
27.05.2016, 10:58 10
Taiphoon, опасная игра. не пробовал.
0
5 / 5 / 2
Регистрация: 15.04.2016
Сообщений: 106
27.05.2016, 11:03  [ТС] 11
В смысле опасная? Есть отдельные функции, а есть общие макросы, которые определяют поведение в зависимости от настроек (фактически тех же макросов). Если везде по коду писать не L"test", а _T("test"), то не вижу проблем.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32574 / 21045 / 8131
Регистрация: 22.10.2011
Сообщений: 36,320
Записей в блоге: 8
27.05.2016, 11:07 12
Не работает ни fprintf, ни _ftprintf. Максимум, чего удается добиться - это кракозябр в файле, вместо знаков вопроса. Но это тоже никому не нужно. Ничего более надежного, чем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String mLogDirectionFilePath = L"D:\\test\\mylog01.txt";
    String MessageString = L"Просто тест";
 
    int fsMode = FileExists(mLogDirectionFilePath) ? fmOpenReadWrite : fmCreate;
 
    std::auto_ptr<TFileStream> log(new TFileStream(mLogDirectionFilePath, fsMode, fmShareDenyWrite));
    RawByteString outpututf8 = UTF8Encode(MessageString);
    if (fsMode == fmCreate)
    {
        TBytes preamble = TEncoding::UTF8->GetPreamble();
        log->WriteBuffer(&preamble[0], preamble.Length);
    }
    else
        log->Seek(log->Size, 0);
 
    outpututf8 = outpututf8 + "\r\n"; // char(13) + char(10);
    log->WriteBuffer(&outpututf8[1], outpututf8.Length());
}
(тестировалось на XE+) пока не придумано.
2
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
27.05.2016, 11:28 13
Цитата Сообщение от volvo Посмотреть сообщение
TEncoding::UTF8->GetPreamble
это BOM?
0
5 / 5 / 2
Регистрация: 15.04.2016
Сообщений: 106
27.05.2016, 12:13  [ТС] 14
В самом начале
C++
1
setlocale(LC_ALL, "Russian");
И в файл выводится всё норм, только в досовской кодировке (866).
Как заменить на 1251?
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32574 / 21045 / 8131
Регистрация: 22.10.2011
Сообщений: 36,320
Записей в блоге: 8
27.05.2016, 12:40 15
Цитата Сообщение от vxg Посмотреть сообщение
это BOM?
Угу, он самый
2
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
27.05.2016, 12:58 16
Taiphoon, а вы пробовали без этой вот строки работать? у меня русский текст в файлы пишется в 1251 без проблем и без танцев просто взял и написал.
0
5 / 5 / 2
Регистрация: 15.04.2016
Сообщений: 106
27.05.2016, 13:06  [ТС] 17
Так без этой строки как раз "?" с кодом 3F. А с этой строкой пишет, но в кодировке 866.
0
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
27.05.2016, 13:14 18
Taiphoon, у меня код
C++
1
2
3
        std::ofstream os("c:\\temp\\test.txt");
        os << "йцуке";
        os.close();
выводит в файл йцуке в кодировке 1251. никаких локалей не устанавливаю.
0
5 / 5 / 2
Регистрация: 15.04.2016
Сообщений: 106
27.05.2016, 14:22  [ТС] 19
Это обход, а не решение
0
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
27.05.2016, 14:38 20
Цитата Сообщение от Taiphoon Посмотреть сообщение
Это обход, а не решение
тогда я не понял чего надо. напоминает сцену "доктор, я конвертировал строку в 866 и она неверное отображается если я смотрю ее блокнотом через 1251"
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2016, 14:38
Помогаю со студенческими работами здесь

Как изменить кодировку для контрола?
Проблема в том, что необходимо в контроле, например, в комбобоксе, или в листбоксе, отображать...

Определить кодировку при записи в текстовый файл
Выдает, что gedit не может определить кодировку при записи в текстовый файл. Как это исправить...

Указать кодировку при записи событий в текстовый файл
Сообщения об ошибках добавляются в поле Memo и затем по кнопке сохраняются в файл:...

Необходимо открыть файл для записи и чтения, прочитать инфу изменить и записать.
Подскажите начинающему плиз. собственно необходимо открыть файл для записи и чтения, прочитать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru