c语言如何获得文件当前路径?

c语言如何获得文件当前路径?,第1张

http://hi.baidu.com/andywangcn/item/7633efda5517baf9ca0c39c6

获得双斜杠路径不包含文件名春肆

TCHAR _szPath[MAX_PATH + 1]={0}

GetModuleFileName(NULL, _szPath, MAX_PATH)

(_tcsrchr(_szPath, _T('\\')))[1] = 0//删除文件名,只获得路径 字串

CString strPath

for (int n=0_szPath[n]n++)

{

if (_szPath[n]!=_T('\\'))

{

strPath +=_szPath[n]

}

else

{

strPath += _T("\\\\")

}

}

MessageBox(strPath)//输出==e:\\program\\Debug\扒败轿\

/枯散/头文件用到 windows.h

两者属于MFC编程,作用如下:

_tcsstr:字符串1在字符串2中首次出现的位置,未出现返回NULL值;

_tcsrchr:字符1 在字符串2中首次出现的位置,未出现返回NULL值

微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数,vc++是微软公司开发的c/c++的集成开发环境,所谓集成开发环境,就是说利用它可以编辑,编译,调试,而不是使用多种工具轮换 *** 作,灵活性较大。vc也指它的内部编译器,集成开发环境必须有一个编译器内核,例如DevC++其中一个编译器内核就是gcc。 MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率。但是MFC的封装很浅,所以效率上损失不大。

TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码。

TCHAR的引入,主要是在Tchar.h文件中,该文件包含这方面的重要的定义信息。

对于包含了对str函数或wcs函数进行显式调用的代码来说,无法非常容易地同时为肆让答ANSI和Unicode对这些代码进行编译。本章前面说过,可以创建同时为ANSI和Unicode进行编译的单个源代码文件。若要建立双重功能,必须包含TChar.h文件,而不是包含String.h文件。

TChar.h文件的唯一作用是帮助创建ANSI/Unicode通用源代码文件。它包含应该用在源代码中的一组宏,而不应该直接调用str函数或者wcs函数。如果在编译源代码文件时定义了_UNICODE,这些宏就会引用wcs这组函数。如果没有定义_UNICODE,那么这些宏将引用str这组宏。

TCHAR的定义如下:

#ifdef

UNICODE

typedef

wchar_t

TCHAR

#else

typedef

char

TCHAR

#endif

所以用MBCS来build时,TCHAR是char,使用UNICODE时,TCHAR是wchar_t。

还有一个宏来处理定义Unicode字符串常量时所需的L前缀。

#ifdef

UNICODE

#define

_T(x)

L##x

#define

_TEXT(x)

L##x

#define

__T(x)

L##x

#else

#define

_T(x)

x

#define

_TEXT(x)

x

#define

__T(x)

x

#endif

##

是一个预处理 *** 作符,它可以把两个参数连在一起。如果代码中需要字符串常量,在它前面加上_T宏。如果你使用Unicode来build,它会在字符串常量前加上L前缀。

TCHAR

szNewText[]

=

_T("we

love

Bob!")

_UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。

像是用宏来隐藏SetWindowTextA/W的细节一样,还有很多可以使用的宏来实现str***()和_mbs***()等字符串函数。例如,可以使用_tcsrchr宏来替换strrchr()、_mbsrchr()和wcsrchr()。_tcsrchr根据预定义的宏是_MBCS还是UNICODE来扩展成正确的函数,就象SetWindowText所作的一样。

不仅str***()函数有TCHAR宏。其他的函数如,

_stprintf(代替sprinft()和swprintf()),_tfopen(代替fopen()和_wfopen())。

MSDN中"Generic-Text

Routine

Mappings."标题下有完整的宏列表。

Windows字符串函数

Windows还提供了一组范围很广的字符串 *** 作函数。这些函数与C运行期字符串函数(如strcpy和wcscpy)很相似。但是该 *** 作系统函数是 *** 作系统的一个组成部分, *** 作系统的许多组件都使用这些函数,而不使用C运行期库。建议最好使用 *** 作系统函数,而不要使用C运行期字符串函数。这将有助于稍稍提高应用程序的运行性能,因为 *** 作系统字符串函数常常被大型应用程序比如 *** 作系统的外壳进程Explorer.exe所使用。由于这些函数使用得很裂慧多,因此,在应用程序运行时,它们可能已经被装入RAM。

若要使用这些函数,系统必须运行Windows

2000或Windows

98。如果安装了Internet

Explorer

4.0或更新的版本,也可以在较早的Windows版本中获得这些函数。

在经典的 *** 作系统函数样式中, *** 作系统字符串函数名既包含大写字母,也包含小写字母,它的形式类似这个样子:StrCat、StrChr、StrCmp和StrCpy等。若要使用这些函数,必须加上ShlWApi.h头文件。另外,如前所述滑迹,这些字符串函数既有ANSI版本,也有Unicode版本,例如StrCatA

和StrCatW。由于这些函数属于 *** 作系统函数,因此,当创建应用程序时,如果定义了UNICODE(不带前置下划线),那么它们的符号将扩展为宽字符版本。

Windows也提供了一组用于对Unicode字符串进行 *** 作的函数,表2

-

4对它们进行了描述。

表2-4

对Unicode字符串进行 *** 作的函数

函数描述

lstrcat

将一个字符串置于另一个字符串的结尾处

lstrcmp

对两个字符串进行区分大小写的比较

lstrcmpi

对两个字符串进行不区分大小写的比较

lstrcpy

将一个字符串拷贝到内存中的另一个位置

lstrlen

返回字符串的长度(按字符数来计量)

这些函数是作为宏来实现的,这些宏既可以调用函数的Unicode版本,也可以调用函数的ANSI版本,这要根据编译源代码模块时是否已经定义了UNICODE而定。例如,如果没有定义UNICODE,lstrcat函数将扩展为lstrcatA。如果定义了UNICODE,lstrcat将扩展为lstrcatW。

在windows环境下 *** 作DBCS:

如果只是调用strlen函数,那么无法真正了解字符串中究竟有多少字符,它只能知道到达结尾的0之前有多少个字节。ANSI的C运行期库中没有配备相应的函数,能够对双字节字符集进行 *** 作。但是,Microsoft

Visual

C++的运行期库却包含许多函数,如_mbslen

,它可以用来 *** 作多字节(既包括单字节也包括双字节)字符串。

为了帮助对DBCS字符串进行 *** 作,Windows提供了下面的一组帮助函数(见表2

-

1

)。前两个函数CharNext

和CharPrev

允许前向或逆向遍历DBCS字符串,方法是每次一个字符。第三个函数IsDBCSLeadByte,

在字节返回到一个两字字节符的第一个字节时将返回TRUE。

表2-1

对DBCS字符串进行 *** 作的帮助函数

PTSTR

CharNext(PCTSTR

pszCurrentChar)

返回字符串中的下一个字符的地址

PTSTR

CharPrev(PCTSTR

pszStart,PCTSTR

pszCurrentChar

);

返回字符串中的上一个字符的地址

BOOL

IsDBCSLeadByteTRUE(BYTE

bTestChar);

如果该字节是DBCS字符的第一个字节,则返回


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12221321.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存