从文件夹中读取文件并将其保存为字符串向量

时间:2016-04-17 19:34:39

标签: c++ winapi vector

我正在尝试从文件夹中读取文本文件并将名称保存到字符串向量中。这是我的代码。我可以编译并运行它,但它不会将我的文件保存到向量中。

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;
}
}

非常感谢能提供的任何帮助。

3 个答案:

答案 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中定义的TEXTtchar.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数据的循环不正确(您正在跳过找到的第一个文件)。文件扩展名的比较无效。

尝试更类似的东西,尤其是因为您使用的是FindFirstFilestd::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。