std::ofstream, VC8 и русские пути
От: Tuo_Bellas Россия  
Дата: 24.04.06 12:15
Оценка:
Всем привет!

VC8, XP SP2

#include <iostream>
#include <fstream>

int main()
{
  std::ofstream os("тест.txt"); // (*)
  if (os)
  {
    os << "test";
  }

  std::ofstream osW(L"тест.txt"); // (**) Note unicode here
  if (osW)
  {
    osW << "test";
  }
  return 0;
}


Вариант (*) создает файл с именем "òåñò.txt" (набор букв с диакритическими знаками, похоже на неправильный codepage).
Вариант (**) (который вообще, по идее, компилиться не должен) создает файл с правильным именем "тест.txt".

Как сделать, чтобы работал первый вариант (*)?



Спасибо,
Tuo_Bellas.
Re: std::ofstream, VC8 и русские пути
От: Igore Россия  
Дата: 24.04.06 12:55
Оценка:
Здравствуйте, Tuo_Bellas, Вы писали:

А если заменить русский текст http://rsdn.ru/article/qna/ui/concp.xml
Автор(ы): Алексей Кирюшкин
?
Re[2]: std::ofstream, VC8 и русские пути
От: Tuo_Bellas Россия  
Дата: 24.04.06 13:01
Оценка:
Здравствуйте, Igore, Вы писали:

I>А если заменить русский текст http://rsdn.ru/article/qna/ui/concp.xml
Автор(ы): Алексей Кирюшкин
?


Проблема в том, что текст приходит из системы в виде имени папки "Мои документы". И вообще, это тупиковый путь. Я хочу понять, в чем на самом деле дело.

Спасибо,
Tuo_Bellas.
Re[3]: std::ofstream, VC8 и русские пути
От: Igore Россия  
Дата: 24.04.06 13:21
Оценка:
Здравствуйте, Tuo_Bellas, Вы писали:

T_B>Здравствуйте, Igore, Вы писали:


I>>А если заменить русский текст http://rsdn.ru/article/qna/ui/concp.xml
Автор(ы): Алексей Кирюшкин
?


T_B>Проблема в том, что текст приходит из системы в виде имени папки "Мои документы". И вообще, это тупиковый путь. Я хочу понять, в чем на самом деле дело.


T_B>Спасибо,

T_B>Tuo_Bellas.

Эмм, мой VC 7.1
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
   char FileName[]="тест.txt";
   ofstream os;

//    CharToOem(FileName,FileName);
   cout << FileName << endl;//На консоли бред

   os.open(FileName);
   if (!os)
   {
      cout << "Error file:" << FileName << endl;
      return 0;
   }
   os << "test";
   os.close();
//У меня нормально создался файл тест.txt
   return 0;
}


Если раскоментировать CharToOem, то на консоль выводится правильно, а файл создается "вҐбв.txt", так что я
Re[4]: std::ofstream, VC8 и русские пути
От: Tuo_Bellas Россия  
Дата: 24.04.06 13:26
Оценка:
Здравствуйте, Igore, Вы писали:

I>Если раскоментировать CharToOem, то на консоль выводится правильно, а файл создается "вҐбв.txt", так что я


Так вот в том-то все и дело, что это только под восьмеркой появилось.

Спасибо,
Tuo_Bellas.
Re[5]: std::ofstream, VC8 и русские пути
От: Igore Россия  
Дата: 24.04.06 13:36
Оценка:
Здравствуйте, Tuo_Bellas, Вы писали:

T_B>Здравствуйте, Igore, Вы писали:


I>>Если раскоментировать CharToOem, то на консоль выводится правильно, а файл создается "вҐбв.txt", так что я


T_B>Так вот в том-то все и дело, что это только под восьмеркой появилось.


T_B>Спасибо,

T_B>Tuo_Bellas.

Т.е. в обоих случаях, с CharToOem и без CharToOem файл создается не привильный?
Re[6]: std::ofstream, VC8 и русские пути
От: Tuo_Bellas Россия  
Дата: 24.04.06 13:59
Оценка:
Здравствуйте, Igore, Вы писали:

I>>>Если раскоментировать CharToOem, то на консоль выводится правильно, а файл создается "вҐбв.txt", так что я

T_B>>Так вот в том-то все и дело, что это только под восьмеркой появилось.
I>Т.е. в обоих случаях, с CharToOem и без CharToOem файл создается не привильный?

Да, â¥áâ.txt с ним и òåñò.txt без него.

Спасибо,
Tuo_Bellas.
Re[7]: std::ofstream, VC8 и русские пути
От: Tuo_Bellas Россия  
Дата: 24.04.06 15:33
Оценка:
Здравствуйте, Tuo_Bellas, Вы писали:

I>>>>Если раскоментировать CharToOem, то на консоль выводится правильно, а файл создается "вҐбв.txt", так что я

T_B>>>Так вот в том-то все и дело, что это только под восьмеркой появилось.
I>>Т.е. в обоих случаях, с CharToOem и без CharToOem файл создается не привильный?

T_B>Да, â¥áâ.txt с ним и òåñò.txt без него.


Я вот думаю, может нужно как-то локаль настроить? Для меня i18n в С++ — темный угол. Есть там какие-то рычаги на эту тему?

Спасибо,
Tuo_Bellas.
std::ofstream, VC8 и русские пути
От: saproj  
Дата: 24.04.06 15:52
Оценка: 10 (2)
#Имя: FAQ.cpp.vc8.rusfilenames
Здравствуйте, Tuo_Bellas, Вы писали:

T_B>VC8, XP SP2


#include <iostream>
#include <fstream>

int main()
{
  std::ofstream os("тест.txt"); // (*)
  if (os)
  {
    os << "test";
  }

  std::ofstream osW(L"тест.txt"); // (**) Note unicode here
  if (osW)
  {
    osW << "test";
  }
  return 0;
}

T_B>Вариант (*) создает файл с именем "òåñò.txt" (набор букв с диакритическими знаками, похоже на неправильный codepage).
T_B>Вариант (**) (который вообще, по идее, компилиться не должен) создает файл с правильным именем "тест.txt".

T_B>Как сделать, чтобы работал первый вариант (*)?


#include <iostream>
#include <fstream>
#include <clocale>

int main()
{
  setlocale( LC_ALL, ".ACP" );
  std::ofstream os("тест.txt"); // (*)
  if (os)
  {
    os << "test";
  }

  return 0;
}
Re[2]: std::ofstream, VC8 и русские пути
От: Tuo_Bellas Россия  
Дата: 25.04.06 10:08
Оценка:
Здравствуйте, saproj, Вы писали:

T_B>>VC8, XP SP2


T_B>>
T_B>>  setlocale( LC_ALL, ".ACP" );
T_B>>}


Сработало, спасибо. Только теперь десятичным разделителем считается запятая. Есть ли возможность сделать так, чтобы в пределах моей программы это была точка вне зависимости от выбранной локали?

Спасибо,
Tuo_Bellas.
Re[3]: std::ofstream, VC8 и русские пути
От: ekamaloff Великобритания  
Дата: 25.04.06 10:23
Оценка: 2 (1)
Здравствуйте, Tuo_Bellas, Вы писали:

T_B>Только теперь десятичным разделителем считается запятая. Есть ли возможность сделать так, чтобы в пределах моей программы это была точка вне зависимости от выбранной локали?


setlocale(LC_NUMERIC, "");


?
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.