wchar_t和char的区别。头都大了!!!

studycplus 2007-09-05 02: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的。我现在的程序只能输出文件名。无法输出文件的内容。望高手指教。同时希望各位能给我推荐一些这方面的文章。我在写程序中经常遇到这样的问题。老是搞不清楚到底怎么搞!
...全文
3302 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-10-12
  • 打赏
  • 举报
回复
ls这坟挖的。。。。。
xingheng907 2011-10-12
  • 打赏
  • 举报
回复
没怎么看懂,新手
loops 2007-09-06
  • 打赏
  • 举报
回复
或者
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;
loops 2007-09-06
  • 打赏
  • 举报
回复
16目录下的都是unicode文件吗?如果是的话,当然输不出来,得:
wcout.imbue("chs");
for( size_t i=0; i<str.size(); i++ )
{
wcout.write( &str.at(i),1);
}
pgmsoul 2007-09-06
  • 打赏
  • 举报
回复
保存在文件中文本一般不是UNICODE编码,而是MULTIBYTE.直接当成wchar_t肯定是不行的.要用MultibyteToWideChar转换一下再输出.C++的库函数我是能不用就不用,它和API就是不能通用.(虽然它内部也是用API).一个new malloc都让我头大,它分配的内在和HeapAlloc,GlobalAlloc都不一样,你要是直接HeapFree它就会出错.虽然new malloc最终都是调用HeapAlloc来分配内存.在DLL中分配的就要在DLL中释放,这有时是弄不清是从哪分配的,总之没有通用性.
deer8107 2007-09-06
  • 打赏
  • 举报
回复
MARK 明天好好看看,睡觉了先
dai_weitao 2007-09-06
  • 打赏
  • 举报
回复
mark。
Windows有自己的一套变量类型体系,wchar是为了unicode设置的,按照函数的参数类型使用吧。
xmoon1983 2007-09-06
  • 打赏
  • 举报
回复
mark 学习
loops 2007-09-06
  • 打赏
  • 举报
回复
楼上,有什么办法能让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) );
mgtcllxl 2007-09-06
  • 打赏
  • 举报
回复
同样也头大的问题,mark下
ghostkissangel 2007-09-06
  • 打赏
  • 举报
回复
用FILE in;
in = fopen(..)
char * buf = new char[..]
fread(..)读到buf中,在显示出来
fclose(in);
chai2010 2007-09-06
  • 打赏
  • 举报
回复
mbtowc和wctomb在<stdlib.h>中.
chai2010 2007-09-06
  • 打赏
  • 举报
回复
为什么要把这个问题和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';

全部搞定!
skyell 2007-09-06
  • 打赏
  • 举报
回复
wchar_t 就是宽字符,就是unicode编码的字符
char 就是窄字符,就是平时以ASCII编码的字符

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

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

另, vc++ 中有宽字符的函数,就必然存在功能相同的摘字符函数,楼主只要统一了使用,上面的问题自然就解决了
星羽 2007-09-06
  • 打赏
  • 举报
回复



#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");
}
Leon8086 2007-09-06
  • 打赏
  • 举报
回复
楼上,有什么办法能让wfstream象他兄弟一样使用重载的<<和>>吗?
ReverseEngineering 2007-09-05
  • 打赏
  • 举报
回复
一律用T字符不就行了吗?
飞哥 2007-09-05
  • 打赏
  • 举报
回复
都当char 用就行,抛弃区分宽窄的概念
就行了
这个要递归
就是遍历目录文件
搜这个就行了
Leon8086 2007-09-05
  • 打赏
  • 举报
回复
如果你是在VS下的话,要使用stl的io流来操作文本文件,建议你不要用UNICODE,编译_MBCS版本,VC8.0的io流对UNICODE的支持,嗯,我们可以用凸来形容。如果一定要用UNICODE的版本可以用windows的库函数什么的。
awl005 2007-09-05
  • 打赏
  • 举报
回复
这是<<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位字串。

加载更多回复(8)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧