CSDN-CSDN社区-C/C++-C++ 语言

收藏 wchar_t和char的区别。头都大了!!![问题点数:100]

楼主发表于:2007-09-05 14:54:41
下面是我写的一段程序。目的是将一个文件夹下的所有文件名和此文件中保存的数据中的第一行输出。

#include   "windows.h "
#include   <iostream>
#include   <fstream>
#include   <string>
#include   <stdio.h>

using   namespace   std;

void   main()
{
wstring   fileNameStr;
WIN32_FIND_DATA   findFileData;
HANDLE   hFind;
TCHAR   *pathName   =   L "C:\\Documents   and   Settings\\xglu\\桌面\\16\\*.* ";
//wstring   pathNameStr   =   L "C:\\Documents   and   Settings\\xglu\\桌面\\16\\ ";
//wcout   < <   pathNameStr   < <   endl;
hFind   =   FindFirstFile(pathName,   &findFileData);
ifstream   inputFile;
do
{
wstring   fileName   =   findFileData.cFileName;
inputFile.open(findFileData.cFileName);
string   str;
getline(inputFile,   str);   //将文件的第一行读入str
wcout   < <   fileName   < <   endl;
cout   < <   str   < <   endl;
inputFile.close();
}
while   (FindNextFile(hFind,   &findFileData));


FindClose(hFind);
system( "pause ");
}

头都昏了。这有的函数要char的,有的要wchar_t的。我现在的程序只能输出文件名。无法输出文件的内容。望高手指教。同时希望各位能给我推荐一些这方面的文章。我在写程序中经常遇到这样的问题。老是搞不清楚到底怎么搞!
回复次数:26
  • taodm用户头像
  • taodm
  • (taodm)
  • 等 级:
  • 5

    3

#1楼 得分:0回复于:2007-09-05 14:57:41
这个google一下不就知道了么。
#2楼 得分:0回复于:2007-09-05 15:04:20
高手都哪去了啊
  • lddLinan用户头像
  • lddLinan
  • (http://shop3330)
  • 等 级:
#3楼 得分:0回复于:2007-09-05 15:07:09
建议使用T字头的,《Programming   Applications   for   Microsoft   Windows   4Ed》还算不错,建议看看
  • millky用户头像
  • millky
  • (millky)
  • 等 级:
#4楼 得分:0回复于:2007-09-05 15:09:37
你可以把他们装进一个string里面然后输出就不存在这个问题了。
#5楼 得分:0回复于:2007-09-05 15:16:44
wchar_t的无法装入string的   要装也只能装入wstring这样又有问题了!!!
  • bubu8633用户头像
  • bubu8633
  • (流浪的布布-往来随风 散若烟尘)
  • 等 级:
#6楼 得分:0回复于:2007-09-05 15:20:00
经常有人问类似问题哦

http://www.vckbase.com/document/viewdoc/?id=1082
  • bubu8633用户头像
  • bubu8633
  • (流浪的布布-往来随风 散若烟尘)
  • 等 级:
#7楼 得分:0回复于:2007-09-05 15:20:13
好好看看吧:)
#8楼 得分:0回复于:2007-09-05 15:25:19
都使用中间形式编码
例如     strcpy   用_tcscpy
string   用basic_string <TCHAR> 代替
你找windows核心编程第二章   讲的很详细
  • awl005用户头像
  • awl005
  • (忽然)
  • 等 级:
#9楼 得分:0回复于:2007-09-05 15:59:14
这是 < <windows程序设计> > 第二章里的关于unicode的一部分


维护单一原始码 

当然,使用Unicode也有缺点。第一点也是最主要的一点是,程式中的每个字串都将占用两倍的储存空间。此外,您将发现宽字元执行时期程式库中的函式比常规的函式大。出於这个原因,您也许想建立两个版本的程式-一个处理ASCII字串,另一个处理Unicode字串。最好的解决办法是维护既能按ASCII编译又能按Unicode编译的单一原始码档案。

虽然只是一小段程式,但由於执行时期程式库函式有不同的名称,您也要定义不同的字元,这将在处理前面有L的字串文字时遇到麻烦。

一个办法是使用Microsoft   Visual   C++包含的TCHAR.H表头档案。该表头档案不是ANSI   C标准的一部分,因此那里定义的每个函式和宏定义的前面都有一条底线。TCHAR.H为需要字串参数的标准执行时期程式库函式提供了一系列的替代名称(例如,_tprintf和_tcslen)。有时这些名称也称为「通用」函式名称,因为它们既可以指向函式的Unicode版也可以指向非Unicode版。

如果定义了名为_UNICODE的识别字,并且程式中包含了TCHAR.H表头档案,那么_tcslen就定义为wcslen:

#define   _tcslen   wcslen
如果没有定义UNICODE,则_tcslen定义为strlen:

#define   _tcslen   strlen
等等。TCHAR.H还用一个新的资料型态TCHAR来解决两种字元资料型态的问题。如果定义了   _UNICODE识别字,那么TCHAR就是wchar_t:

typedef   wchar_t   TCHAR   ;
否则,TCHAR就是char:

typedef   char   TCHAR   ;
现在开始讨论字串文字中的L问题。如果定义了_UNICODE识别字,那么一个称作__T的宏就定义如下:

#define   __T(x)   L##x
这是相当晦涩的语法,但合乎ANSI   C标准的前置处理器规范。那一对井字号称为「粘贴符号(token   paste)」,它将字母L添加到宏引数上。因此,如果宏引数是 "Hello! ",则L##x就是L "Hello! "。

如果没有定义_UNICODE识别字,则__T宏只简单地定义如下:

#define   __T(x)   x
此外,还有两个宏与__T定义相同:

#define   _T(x)   __T(x)
#define   _TEXT(x)   __T(x)
在Win32   console程式中使用哪个宏,取决於您喜欢简洁还是详细。基本地,必须按下述方法在_T或_TEXT宏内定义字串文字:

_TEXT   ( "Hello! ")
这样做的话,如果定义了_UNICODE,那么该串将解释为宽字元的组合,否则解释为8位字串。

  • Leon8086用户头像
  • Leon8086
  • (故乡的云·无力&&无聊)
  • 等 级:
#10楼 得分:0回复于:2007-09-05 20:05:52
如果你是在VS下的话,要使用stl的io流来操作文本文件,建议你不要用UNICODE,编译_MBCS版本,VC8.0的io流对UNICODE的支持,嗯,我们可以用凸来形容。如果一定要用UNICODE的版本可以用windows的库函数什么的。
#11楼 得分:0回复于:2007-09-05 20:28:58
都当char   用就行,抛弃区分宽窄的概念
就行了
这个要递归
就是遍历目录文件
搜这个就行了
#12楼 得分:0回复于:2007-09-05 21:50:50
一律用T字符不就行了吗?
  • Chiyer用户头像
  • Chiyer
  • (星羽)
  • 等 级:
  • 5

    4

    5

#13楼 得分:0回复于:2007-09-06 02:18:49



#include   "windows.h "
#include   <iostream>
#include   <fstream>
#include   <string>
#include   <stdio.h>

using   namespace   std;

#ifdef     UNICODE
#define   tstring   wstring
#define   tcout       wcout
#define   tcin         wcin
#define   tifstream   wifstream
#else
#define   tstring   string
#define   tcout       cout
#define   tcin         cin
#define   tifstream   ifstream
#endif

void   main()
{
        tstring   fileNameStr;
        WIN32_FIND_DATA   findFileData;
        HANDLE   hFind;
        TCHAR   *pathName   =   TEXT( "C:\\Documents   and   Settings\\xglu\\桌面\\16\\*.* ");
        hFind   =   FindFirstFile(pathName,   &findFileData);
        tifstream   inputFile;
        do
        {
                tstring   fileName   =   findFileData.cFileName;
                inputFile.open(findFileData.cFileName);
                TCHAR   str[128];
                inputFile.getline(str,   sizeof(str));
              //   inputFile.getline(inputFile,   str);   //将文件的第一行读入str
                tcout   < <   fileName   < <   endl;
                tcout   < <   str   < <   endl;
                inputFile.close();
        }
        while   (FindNextFile(hFind,   &findFileData));

        FindClose(hFind);
        system( "pause ");
}
  • loops用户头像
  • loops
  • (迷茫)
  • 等 级:
#14楼 得分:0回复于:2007-09-06 11:52:28
16目录下的都是unicode文件吗?如果是的话,当然输不出来,得:
wcout.imbue( "chs ");
for(   size_t   i=0;   i <str.size();   i++   )
{
    wcout.write(   &str.at(i),1);
}
  • loops用户头像
  • loops
  • (迷茫)
  • 等 级:
#15楼 得分:0回复于:2007-09-06 12:29:36
或者
wstring   w;
wcout.imbue( "chs ");
for(string::iterator   it   =   abc.begin();   it!=abc.end();   it+=2)
{
    w.push_back(     wcout.widen(*it)+(wcout.widen(   *(it+1)   ) < <8)   );
}
wcout < <w < <endl;
  • Leon8086用户头像
  • Leon8086
  • (故乡的云·无力&&无聊)
  • 等 级:
#16楼 得分:0回复于:2007-09-06 14:17:23
楼上,有什么办法能让wfstream象他兄弟一样使用重载的 < <和> > 吗?
#17楼 得分:0回复于:2007-09-06 14:47:59
wchar_t   就是宽字符,就是unicode编码的字符
char   就是窄字符,就是平时以ASCII编码的字符

例子
char   c1= 'A ';     //生成的exe中c1变量的值就是0x65
wchar_t   c2= 'A ';       //生成的exe中c2变量的值就是0x0065

在程序中同时使用   窄宽   字符,编译有可能不会错,但是运行后往往出现莫名其妙的错误,得不到想要的结果,这就是因为程序在判断字符编码的时候出错。

另,   vc++   中有宽字符的函数,就必然存在功能相同的摘字符函数,楼主只要统一了使用,上面的问题自然就解决了
  • chai2010用户头像
  • chai2010
  • (http://sites.go)
  • 等 级:
#18楼 得分:0回复于:2007-09-06 15:20:22
为什么要把这个问题和C++/windows撤到一起呢???
其实,只要你C学好了就可以搞定一切!!

1.   先设置当地的编码环境

#include   <locale.h>

setlocale(LC_ALL,   " ");

2.   char到wchar_t的转换

char   s[]   =   "汉字 ";
wchar_t   ws[10];

int   i;
char   *p   =   s;

for(i   =   0;   *p;   ++i)
{
int   len   =   mbtowc(&ws[i],   p,   MB_CUR_MAX);
p   +=   len;
}
ws[i]   =   L '\0 ';

3.   wchar_t到char的转换

wchar_t   ws[]   =   L "中a国 ";
char   s[12],   *p;

p   =   s;

int   i;
for(i   =   0;   ws[i];   ++i)
{
int   len   =   wctomb(p,   ws[i]);
p   +=   len;
}
*p   =   '\0 ';

全部搞定!
  • chai2010用户头像
  • chai2010
  • (http://sites.go)
  • 等 级:
#19楼 得分:0回复于:2007-09-06 15:23:30
mbtowc和wctomb在 <stdlib.h> 中.
#20楼 得分:0回复于:2007-09-06 16:46:20
用FILE   in;
in   =   fopen(..)
char   *   buf   =   new   char[..]
fread(..)读到buf中,在显示出来
fclose(in);
  • mgtcllxl用户头像
  • mgtcllxl
  • (若我离去,后会无期)
  • 等 级:
#21楼 得分:0回复于:2007-09-06 17:32:21
同样也头大的问题,mark下
  • loops用户头像
  • loops
  • (迷茫)
  • 等 级:
#22楼 得分:0回复于:2007-09-06 20:11:40
楼上,有什么办法能让wfstream象他兄弟一样使用重载的 < <和> > 吗?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
看来这个问题困惑了不少人啊。
http://community.csdn.net/Expert/topic/5636/5636379.xml?temp=.3116724


ps.上面的转换的方法写得不对。
w.push_back(     wcout.widen(*it)+(wcout.widen(   *(it+1)   ) < <8)   );
得改成:
w.push_back(     (   (   (unsigned   short)(unsigned   char)(*(it+1))) < <8   )+   (unsigned   short)(unsigned   char)*(it)     );
#23楼 得分:0回复于:2007-09-06 22:25:30
mark   学习
  • dai_weitao用户头像
  • dai_weitao
  • (到哪里都是战士)
  • 等 级:
  • 2

#24楼 得分:0回复于:2007-09-06 22:30:26
mark。
Windows有自己的一套变量类型体系,wchar是为了unicode设置的,按照函数的参数类型使用吧。
#25楼 得分:0回复于:2007-09-06 23:15:50
MARK   明天好好看看,睡觉了先
#26楼 得分:0回复于:2007-09-06 23:17:55
保存在文件中文本一般不是UNICODE编码,而是MULTIBYTE.直接当成wchar_t肯定是不行的.要用MultibyteToWideChar转换一下再输出.C++的库函数我是能不用就不用,它和API就是不能通用.(虽然它内部也是用API).一个new   malloc都让我头大,它分配的内在和HeapAlloc,GlobalAlloc都不一样,你要是直接HeapFree它就会出错.虽然new   malloc最终都是调用HeapAlloc来分配内存.在DLL中分配的就要在DLL中释放,这有时是弄不清是从哪分配的,总之没有通用性.
相关问题
vc++ 2005 類型問題char[100] to LPCTSTR
窄串与宽串的区别C/C++ / C++ 语言- CSDN社区community.csdn.net
一个编码的问题? C/C++ / C++ 语言- CSDN社区community.csdn.net
有关宽字符的问题C/C++ / C++ 语言- CSDN社区community.csdn.net
究竟采用multibyte还是unicode?
wcout,wofstream等宽字符IO UNICODE问题
关于LPCTSTR,LPTSTR,CSTRING,CHAR *等等的区别VC/MFC / 基础类 ...
vc中这么多字符类型有什么区别呀?char、TCHAR、char *、const char ...
问个问题VC/MFC / 基础类- CSDN社区community.csdn.net