学习总结:
01,学习到不少东西。
-tmain()-------是控制台程序入口函数
--WINAPI _tWinMain---------是windows窗口程序入口函数
关键是,2个函数可以同时存在,只是由于vc项目环境设置不同,会自动调用不同的函数入口。
02,FindNextFile和FindFirstFile,这2个api函数的用法,有了比较深入的了解
03,sprintf---sprintf指的是字符串格式化命令,函数声明为 int sprintf(char *string, char *format [,argument,...]);


04,strcmp 与_tcscmp的区别
strcmp 用来比较ANSI字符串,而_tcscmp用 来比较UNICODE(宽字符)的字符串。ANSI字符串中,1个英文字母为1个字节,1个中文字符为2个字节,遇到0字符表示字符串结束。而在 UNICODE(宽字符)中,所有的字符都为2个字节,此时字符串中间的字节,可能含有0字符,此时就不能用strcmp比较了。
Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字 的情况。而后者是双字节方式,方便处理双字节字符。Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello")。如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程 序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以以 UNICODE方式保存。

05,cout和wcout
总结几点:
1、cout是用来输出char的,如果用cout输出wchar,只会输出地址,要使用wcout输出wchar。
2、wcout默认是不输出中文的,要想输出中文,要先加入setlocale( LC_ALL, "chs" );这行代码。
06,c++里&是什么意思?
&:在C++中有两种意思,一bai种du是取地址符,是单目运算zhi符;另一种是位运算符,表dao示“按zhuan位与”,是双shu目运算符。
a&b表示a和b执行按位与运算。
按位与运算符(&)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
07,# 关于WIN32_FIND_DATA中的dwFileAttributes
这局代码的理解:if ((FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) > 0)

================




接下来,就是实战阶段。


截图图片:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <tchar.h>
#include <URLmon.h>
using namespace std;
#pragma comment(lib,"Urlmon.lib")
//枚举文件,2个参数,文件夹路径和要查找的文件类型。
BOOL EnumFiles(LPCTSTR lpszPath, LPCTSTR lpszType)
{
TCHAR szPath[MAX_PATH] = {0};
_stprintf(szPath, _T("%s\\%s"), lpszPath, lpszType); //字符串格式化,将文件夹路径和文件类型合并成一个。
WIN32_FIND_DATA FindData = { 0 };
HANDLE hFile= FindFirstFile(szPath, &FindData);
if (hFile == INVALID_HANDLE_VALUE) return FALSE;
BOOL bRet = FALSE;
do
{
bRet = FindNextFile(hFile, &FindData);
if (!bRet) //如果找不到下一个文件,跳出循环
{
break;
}
wcout << FindData.cFileName << endl; //cfilename是 char字符集。但是属性用的unicode字符集,所以需要用wcout
} while (bRet);
return true;
}
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) //当项目属性--链接器--系统--窗口,会调用此入口。
{
EnumFiles(_T("C:\\Windows"), _T("*.*"));
return 0;
}
int _tmain(int argc, TCHAR *argv[]) //当项目属性--链接器--系统--控制台,会调用此入口。
{
EnumFiles(_T("C:\\Windows"), _T("*.*"));
return 0;
}
拓展难度:


最终完整版代码:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <tchar.h>
#include <URLmon.h>
using namespace std;
#pragma comment(lib,"Urlmon.lib")
//枚举文件,2个参数,文件夹路径和要查找的文件类型。
BOOL EnumFiles(LPCTSTR lpszPath, LPCTSTR lpszType)
{
TCHAR szPath[MAX_PATH] = {0};
_stprintf(szPath, _T("%s\\%s"), lpszPath, lpszType); //字符串格式化,将文件夹路径和文件类型合并成一个。
WIN32_FIND_DATA FindData = { 0 };
HANDLE hFile= FindFirstFile(szPath, &FindData);
if (hFile == INVALID_HANDLE_VALUE) return FALSE;
BOOL bRet = FALSE;
do
{
bRet = FindNextFile(hFile, &FindData);
if (!bRet) //如果找不到下一个文件,跳出循环
{
break;
}
//判断一个文件夹是一个文件
if ((FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) > 0)
{
if (_tcscmp(FindData.cFileName,_T(".")||_tcscmp(FindData.cFileName,_T("..") ) ) //如果文件夹名字,是.或者..,就跳过展示
{
continue;
}
//这是一个文件夹
cout << "文件夹:";
}
else
{
//这是一个文件
cout << "文件:";
}
wcout << FindData.cFileName << endl; //cfilename是 char字符集。但是属性用的unicode字符集,所以需要用wcout
} while (bRet);
return true;
}
int _tmain(int argc, TCHAR *argv[]) //当项目属性--链接器--系统--控制台,会调用此入口。
{
EnumFiles(_T("C:\\Windows"), _T("*.*"));
return 0;
}
网友评论