我正在尝试从文件夹中读取文本文件并将名称保存到字符串向量中。这是我的代码。我可以编译并运行它,但它不会将我的文件保存到向量中。
int main(){
Data Dataset;
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
// Find the first file in the directory.
hFind = FindFirstFile(LPCTSTR("C:\\Users\\bla\\Desktop\\c++\\data\\*"), &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) {
cout<<"ERROR"<<endl;
}
else{
while (FindNextFile(hFind, &FindFileData) != 0) {
if(FindFileData.cFileName=="*.txt")
{
Dataset.name.push_back(FindFileData.cFileName);
}
cout<<FindFileData.cFileName<<endl;
}
FindClose(hFind);
}
for(int i=0; i<Dataset.name.size(); i++){
cout<<Dataset.name[i]<<endl;
}
}
非常感谢能提供的任何帮助。
答案 0 :(得分:2)
一个问题是:
FindFileData.cFileName=="*.txt"
首先,这不会比较字符串。它比较指针值。如果您想比较字符串,请使用_tcscmp
:
if ( _tcscmp(FindFileData.cFileName, _T("*.txt")) == 0 )
其次,这是错误的:
hFind = FindFirstFile(LPCTSTR("C:\\Users\\bla\\Desktop\\c++\\data\\*"), &FindFileData);
您正在尝试将非宽字符串转换为可能较宽或可能不宽的字符串,具体取决于项目的字符集构建类型(我假设您正在使用Visual Studio,但它与您的C ++工具无关)。
底线是从不投射字符串类型以适合参数类型。转换字符串不将字符串从一种类型转换为另一种类型。你应该编写永远不需要编译字符串的代码 - 如果你最终编译字符串,代码是错误的。
如果你删除了强制转换,你总是可以告诉某些事情是坏的或需要非常仔细地查看,并且通过移除强制转换,编译器会抛出一个错误,告诉你这些类型不匹配(这不仅仅是对于字符串,但您认为需要投射的任何类型。)
对于此实例,修复方法是使用_T
中定义的TEXT
或tchar.h
宏来为您提供相应的字符串文字类型。
hFind = FindFirstFile(_T("C:\\Users\\bla\\Desktop\\c++\\data\\*"), &FindFileData);
最后,您真的要将文件名与&#34; * .txt &#34;?进行比较Windows系统中的任何文件都不能用星号命名。
答案 1 :(得分:0)
您的代码存在许多问题。 Flyway flyway = new Flyway ();
flyway.setDataSource ( "jdbc:h2:~/test" , "scott" , "tiger" );
flyway.migrate ();
数据处理不正确。 TCHAR
数据的循环不正确(您正在跳过找到的第一个文件)。文件扩展名的比较无效。
尝试更类似的东西,尤其是因为您使用的是FindFirstFile
和std::string
,这意味着您还使用基于ANSI的Win32 API(否则您显示的代码将无法编译):< / p>
std::cout
否则,您应该切换到struct Data
{
std::vector<std::string> name;
unsigned int vehicle;
unsigned int dim;
int maxQ;
};
int main()
{
Data Dataset;
WIN32_FIND_DATAA FindFileData;
HANDLE hFind;
DWORD dwErr;
// Find the first file in the directory.
hFind = FindFirstFileA("C:\\Users\\bla\\Desktop\\c++\\data\\*.txt", &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
dwErr = GetLastError();
if (dwErr != ERROR_FILE_NOT_FOUND)
std::cerr << "ERROR: " << dwErr << std::endl;
}
else
{
do
{
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
{
Dataset.name.push_back(FindFileData.cFileName);
//std::cout << FindFileData.cFileName << std::endl;
}
}
while (FindNextFileA(hFind, &FindFileData));
dwErr = GetLastError();
if (dwErr != ERROR_NO_MORE_FILES)
std::cerr << "ERROR: " << dwErr << std::endl;
FindClose(hFind);
}
for(int i = 0; i < Dataset.name.size(); i++)
{
std::cout << Dataset.name[i] << std::endl;
}
return 0;
}
和std::wstring
以及基于Unicode的API:
std::wcout
如果您因任何原因必须坚持struct Data
{
std::vector<std::wstring> name;
unsigned int vehicle;
unsigned int dim;
int maxQ;
};
int main()
{
Data Dataset;
WIN32_FIND_DATAW FindFileData;
HANDLE hFind;
DWORD dwErr;
// Find the first file in the directory.
hFind = FindFirstFileW(L"C:\\Users\\bla\\Desktop\\c++\\data\\*.txt", &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
dwErr = GetLastError();
if (dwErr != ERROR_FILE_NOT_FOUND)
std::wcerr << L"ERROR: " << dwErr << std::endl;
}
else
{
do
{
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
{
Dataset.name.push_back(FindFileData.cFileName);
//std::wcout << FindFileData.cFileName << std::endl;
}
}
while (FindNextFileW(hFind, &FindFileData));
dwErr = GetLastError();
if (dwErr != ERROR_NO_MORE_FILES)
std::wcerr << L"ERROR: " << dwErr << std::endl;
FindClose(hFind);
}
for(int i = 0; i < Dataset.name.size(); i++)
{
std::wcout << Dataset.name[i] << std::endl;
}
return 0;
}
数据,您可以选择这样做:
TCHAR
答案 2 :(得分:-1)
我认为问题的主要原因在于这行代码
Dataset.name.push_back(FindFileData.cFileName);
在这一行中,您将WIN32_FIND_DATA::cFileName
属性直接推回到向量,并且因为下次调用FindNextFile
时该属性的向量保持地址将覆盖以前的值。因此,最好分配新缓冲区并将WIN32_FIND_DATA::cFileName
复制到此新缓冲区,然后将此新缓冲区推送到vector。