473,387 Members | 1,536 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

wstring & wifstream

Hi,
I have my program using wstring everywhere instead of string.
Similarly I need to process some file, which contains unicode or ascii
character. I need to stream them. Thus I use wifstream etc. However the
open member function of is not templated, and use const char* as
filename. I have my filename as wstring, where c_str() returns const
wchar_t* type. Thus how to convert a wstring to string or const char*
and pass to open of wifstream?

Sep 29 '06 #1
9 9581

"toton" <ab*******@gmail.comschrieb im Newsbeitrag
news:11*********************@m7g2000cwm.googlegrou ps.com...
Hi,
I have my program using wstring everywhere instead of string.
Similarly I need to process some file, which contains unicode or
ascii
character. I need to stream them. Thus I use wifstream etc. However
the
open member function of is not templated, and use const char* as
filename. I have my filename as wstring, where c_str() returns const
wchar_t* type. Thus how to convert a wstring to string or const
char*
and pass to open of wifstream?
I know of functions:
mbtowc and wctomb. I don't know if they are std, nor do I know of a
C++ pendant.
Sep 29 '06 #2
toton wrote:
Hi,
I have my program using wstring everywhere instead of string.
Similarly I need to process some file, which contains unicode or ascii
character. I need to stream them. Thus I use wifstream etc. However the
open member function of is not templated, and use const char* as
filename. I have my filename as wstring, where c_str() returns const
wchar_t* type. Thus how to convert a wstring to string or const char*
and pass to open of wifstream?
You need to know a bit about the locale settings, but frankly they
could be almost anything. If you're lucky you may find some compiler
specific details on what form the const char * should be. It is a shame
that this part of the standard is still living in the older C universe.

You don't say which platform you're using but the wide character
streams are badly broken on Microsoft's compiler. In practice you
cannot write Unicode characters to them.

There is a part of the Boost library that deals with these issus, but
I've only taken a quick look at it and haven't actually tried them yet.
Kirit

Sep 29 '06 #3

Kirit Sælensminde wrote:
toton wrote:
Hi,
I have my program using wstring everywhere instead of string.
Similarly I need to process some file, which contains unicode or ascii
character. I need to stream them. Thus I use wifstream etc. However the
open member function of is not templated, and use const char* as
filename. I have my filename as wstring, where c_str() returns const
wchar_t* type. Thus how to convert a wstring to string or const char*
and pass to open of wifstream?

You need to know a bit about the locale settings, but frankly they
could be almost anything. If you're lucky you may find some compiler
specific details on what form the const char * should be. It is a shame
that this part of the standard is still living in the older C universe.

You don't say which platform you're using but the wide character
streams are badly broken on Microsoft's compiler. In practice you
cannot write Unicode characters to them.
Most of the cases I don't need to read wide charater from stream.
However I am passing the file name for reading which can be wchat type
(i.e only the file name, not the file itself). So file.open() is
creating problem. I pass the file name from some GUI (wxWidgets) which
has a string type of unicode build, a thin wrapper over STL string.n
Thus it's c_str() returns a const wchar_t*. Unfortunately I am using
Windows & visual studio 2003. I had expected a template open function
for ifstream or it's base! .even if ifstream can open the file with the
filename as wide char is fine form me (My file is still ascii, though
file format specifies nothing about encoding). The GUI library
(wxWidgets) gives a function to convert wide char to char type using
current codepage , but I am not sure still will it be able to take care
of languages other than english.
There is a part of the Boost library that deals with these issus, but
I've only taken a quick look at it and haven't actually tried them yet.
can you give a reference to the section is boost?

thanks

Kirit
Sep 29 '06 #4
"Kirit Sælensminde" <ki****************@gmail.comwrote in message
news:11**********************@m7g2000cwm.googlegro ups.com...
toton wrote:
>Hi,
I have my program using wstring everywhere instead of string.
Similarly I need to process some file, which contains unicode or ascii
character. I need to stream them. Thus I use wifstream etc. However the
open member function of is not templated, and use const char* as
filename. I have my filename as wstring, where c_str() returns const
wchar_t* type. Thus how to convert a wstring to string or const char*
and pass to open of wifstream?

You need to know a bit about the locale settings, but frankly they
could be almost anything. If you're lucky you may find some compiler
specific details on what form the const char * should be. It is a shame
that this part of the standard is still living in the older C universe.

You don't say which platform you're using but the wide character
streams are badly broken on Microsoft's compiler. In practice you
cannot write Unicode characters to them.
In practice they're not broken and you can write Unicode characters.
As with any other Standard C++ library, you need an appropriate
codecvt facet for the code conversion you favor. See our add-on
library, which includes a broad assortment.
There is a part of the Boost library that deals with these issus, but
I've only taken a quick look at it and haven't actually tried them yet.
P.J. Plauger
Dinkumware, Ltd.
http://www.dinkumware.com
Sep 30 '06 #5
P.J. Plauger wrote:
"Kirit Sælensminde" <ki****************@gmail.comwrote in message
news:11**********************@m7g2000cwm.googlegro ups.com...
toton wrote:
Hi,
I have my program using wstring everywhere instead of string.
Similarly I need to process some file, which contains unicode or ascii
character. I need to stream them. Thus I use wifstream etc. However the
open member function of is not templated, and use const char* as
filename. I have my filename as wstring, where c_str() returns const
wchar_t* type. Thus how to convert a wstring to string or const char*
and pass to open of wifstream?
You need to know a bit about the locale settings, but frankly they
could be almost anything. If you're lucky you may find some compiler
specific details on what form the const char * should be. It is a shame
that this part of the standard is still living in the older C universe.

You don't say which platform you're using but the wide character
streams are badly broken on Microsoft's compiler. In practice you
cannot write Unicode characters to them.

In practice they're not broken and you can write Unicode characters.
As with any other Standard C++ library, you need an appropriate
codecvt facet for the code conversion you favor. See our add-on
library, which includes a broad assortment.
I presume that I'm just going to show my ignorance of the iostreams
library, but I don't mind that if I can learn how to do this correctly.

Because the OP's question is about wide character filenames rather than
writing wide characters to streams I'm going to start a different
thread as I don't want to hijack this one (any further).
K

Sep 30 '06 #6
"Kirit Sælensminde" <ki****************@gmail.comwrote in message
news:11**********************@e3g2000cwe.googlegro ups.com...

P.J. Plauger wrote:
"Kirit Sælensminde" <ki****************@gmail.comwrote in message
news:11**********************@m7g2000cwm.googlegro ups.com...
toton wrote:
Hi,
I have my program using wstring everywhere instead of string.
Similarly I need to process some file, which contains unicode or ascii
character. I need to stream them. Thus I use wifstream etc. However the
open member function of is not templated, and use const char* as
filename. I have my filename as wstring, where c_str() returns const
wchar_t* type. Thus how to convert a wstring to string or const char*
and pass to open of wifstream?
You need to know a bit about the locale settings, but frankly they
could be almost anything. If you're lucky you may find some compiler
specific details on what form the const char * should be. It is a shame
that this part of the standard is still living in the older C universe.

You don't say which platform you're using but the wide character
streams are badly broken on Microsoft's compiler. In practice you
cannot write Unicode characters to them.

In practice they're not broken and you can write Unicode characters.
As with any other Standard C++ library, you need an appropriate
codecvt facet for the code conversion you favor. See our add-on
library, which includes a broad assortment.
I presume that I'm just going to show my ignorance of the iostreams
library, but I don't mind that if I can learn how to do this correctly.

Because the OP's question is about wide character filenames rather than
writing wide characters to streams I'm going to start a different
thread as I don't want to hijack this one (any further).

Right, it was, and I forgot to address that point too. The latest
VC++ library, like our add-on library, lets you open files by
name specified as a wchar_t * string.

P.J. Plauger
Dinkumware, Ltd.
http://www.dinkumware.com
Sep 30 '06 #7
"P.J. Plauger" <pj*@dinkumware.comwrites:
In practice they're not broken and you can write Unicode characters.
As with any other Standard C++ library, you need an appropriate
codecvt facet for the code conversion you favor. See our add-on
library, which includes a broad assortment.
This is probably a bit OT, but I'm wondering why you would have to set
this up manually. I don't know what the language requirements are
(there are probably none, as usual), but on unix platforms

std::cout.imbue( std::locale("") );

usually inherit the locale from the environment, _except_ for the
character encoding as it appears.

However,

setlocale(LC_ALL, "");

does inherit even the code conversion from the environment on my
system.

Test case:

#include <iostream>
#include <cstdio>

using namespace std;

int main(int argc, char** argv)
{
cout.imbue( locale("") );

// 0xc3 0xa4 is UTF8 for 0xe4, which is À

cout << " cout: " << char(0xc3) << char(0xa4) << endl; //prints À
wcout << L"wcout: " << wchar_t(0xe4) << endl; //doesn't

setlocale(LC_ALL, "");

char const* narrow = "\xc3\xa4";
wchar_t const* wide = L"\xe4";

printf("printf narrow: %s\n", narrow); //prints À
printf("printf wide: %ls\n", wide); //does likewise
}

I presume this is just my broken platform?

Regards,

Jens
Sep 30 '06 #8
"Jens Theisen" <jt***@arcor.dewrote in message
news:87************@arcor.de...
"P.J. Plauger" <pj*@dinkumware.comwrites:
>In practice they're not broken and you can write Unicode characters.
As with any other Standard C++ library, you need an appropriate
codecvt facet for the code conversion you favor. See our add-on
library, which includes a broad assortment.

This is probably a bit OT, but I'm wondering why you would have to set
this up manually. I don't know what the language requirements are
(there are probably none, as usual), but on unix platforms

std::cout.imbue( std::locale("") );

usually inherit the locale from the environment, _except_ for the
character encoding as it appears.

However,

setlocale(LC_ALL, "");

does inherit even the code conversion from the environment on my
system.

Test case:

#include <iostream>
#include <cstdio>

using namespace std;

int main(int argc, char** argv)
{
cout.imbue( locale("") );

// 0xc3 0xa4 is UTF8 for 0xe4, which is ä

cout << " cout: " << char(0xc3) << char(0xa4) << endl; //prints ä
wcout << L"wcout: " << wchar_t(0xe4) << endl; //doesn't

setlocale(LC_ALL, "");

char const* narrow = "\xc3\xa4";
wchar_t const* wide = L"\xe4";

printf("printf narrow: %s\n", narrow); //prints ä
printf("printf wide: %ls\n", wide); //does likewise
}

I presume this is just my broken platform?
Nothing broken about it that I can see. The C++ Standard says regrettably
little about how all this stuff should work.

P.J. Plauger
Dinkumware, Ltd.
http://www.dinkumware.com
Sep 30 '06 #9

P.J. Plauger wrote:
"Jens Theisen" <jt***@arcor.dewrote in message
news:87************@arcor.de...
"P.J. Plauger" <pj*@dinkumware.comwrites:
In practice they're not broken and you can write Unicode characters.
As with any other Standard C++ library, you need an appropriate
codecvt facet for the code conversion you favor. See our add-on
library, which includes a broad assortment.
This is probably a bit OT, but I'm wondering why you would have to set
this up manually. I don't know what the language requirements are
(there are probably none, as usual), but on unix platforms

std::cout.imbue( std::locale("") );

usually inherit the locale from the environment, _except_ for the
character encoding as it appears.

However,

setlocale(LC_ALL, "");

does inherit even the code conversion from the environment on my
system.

Test case:
[snip]

I presume this is just my broken platform?

Nothing broken about it that I can see. The C++ Standard says regrettably
little about how all this stuff should work.
I've put my questions in another thread as promised at:

http://groups.google.com/group/comp....651dc92162b5fb

I'm not sure what the standard says about how wide character streams
should behave and questions about that are also in my post.

If the streams aren't broken then I'm sure you can tell me what I'm
missing to get them to work.
K

Oct 2 '06 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Saurabh Aggrawal | last post by:
Hi, On line nos. 24, 25, 26 24: wstring cfMethods = {{L"setLabel"},{L""}}; 25: wstring cfProperties= {{L"isVisible"},{L""}}; 26: wstring cfEvents =...
0
by: Steven T. Hatton | last post by:
I copied what I believe is a complete representation of <iosfwd> from ISO/IEC 14882:2003(E). My understanding of the rules covering typedefs, templates and forward declarations is not very solid. ...
2
by: anubis | last post by:
Heay, i've got this problem: http://rafb.net/paste/results/lpNgbn49.html i'm using wifstream to read utf-16 file and i've got this problem, that each byte is read into seperate char while...
3
by: uday.sen | last post by:
Hi, I am porting a piece of code from VC++ to linux platform. My compiler is g++ 3.2.2. I am getting following error: no matching function for call to A::setResponse(std::wstring) candidates...
8
by: Divick | last post by:
Hi all, can somebody tell how much std::wstring is supported across different compilers on different platforms? AFAIK std::string is supported by almost all C++ compilers and almost all platforms,...
9
by: Mwob | last post by:
Hi, I have a very simple function, declared like this: wstring CMyClass::GetDate() { .... wcsftime (sDateString,255,L"%d-%b-%Y",&dTmpDate); wstring sText(sDateString); return sText;
2
by: wolverine | last post by:
Hi Could any one tell me how to compile the code using wstring with g++ or gcc. I am using gcc version 3.4.2 #include<iostream> #include<string> using namespace std; int main() {
10
by: v4vijayakumar | last post by:
1. why the following program is not working as expected? #include <iostream> using namespace std; int main() { string t("test"); wcout << (wchar_t *) t.c_str() << endl; wcout << t.c_str()...
1
by: v4vijayakumar | last post by:
1. Why the following program is not working as expected? #include <iostream> using namespace std; int main() { string t("test"); wcout << (wchar_t *) t.c_str() << endl; wcout << t.c_str()...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.