c++ 不存在从“const std::filesystem::path”到“char *”的适当转换函数

but5z9lq  于 2023-03-25  发布在  其他
关注(0)|答案(2)|浏览(309)

我是一个C++初学者。我已经学了一个星期了。
我在摆弄<filesystem>库,试图学习新东西。我试图创建一个函数来接收.txt文件的路径,并读取文件内容以将其打印到控制台。但是,我遇到了标题中的这个问题:

using namespace std;
using namespace std::filesystem;

void read_file(char File[260]);

int main(){
    for (auto entry: recursive_directory_iterator("C:\\Users\\malar\\AppData\\Local")){
        try{
            if (entry.path().extension() == ".txt"){
                read_file(entry.path()); // no suitable conversion function from "const std::filesystem::path" to "char *" exists
            }
        }
        catch (filesystem_error){
            continue;
        }
    }
    
    return 0;
}

void read_file(char File[260]){
    FILE *rf = fopen(File, "r"); // rf = read file
    char Buffer[260];
    if (rf == NULL){
        cout << "File: " << File << " Cannot be opened\n";
    }
    while (fread(Buffer, 260, 1, rf) != NULL){
        cout << Buffer << endl;
    }
    fclose(rf);
    cout << "File Closed\n";
}

我已经尝试通过类型转换来解决这个问题,但也许我用了错误的类型?

wgxvkvu9

wgxvkvu91#

首先使用path::string()path::u8string()(UTF-8)来获取路径,然后可以使用string::c_str()方法。

2guxujil

2guxujil2#

你的read_file()函数需要一个(非常量!)char*指针(在函数参数中,像char[N]这样的数组只是像char*这样的指针的语法糖)。你传递给它一个std::filesystem::path对象,但是没有定义从system::filesystem::pathchar*的转换,因此编译器错误。
然而,std::filesystem::path确实有一个到std::wstring(仅在Windows上,您似乎正在运行)或std::string(在Posix系统上)的隐式转换。它也有公共(w|u8|u16|u32)string()方法。
所以,在你的例子中,如果你让read_file()接受一个const char*指针(这就是fopen()所期望的),你可以把entry.path.string().c_str()的返回值传递给它,例如:

void read_file(const char *File);
...
read_file(entry.path().string().c_str());

如果你使用的是C++风格的文件I/O(即通过std::ifstream),那么你可以使用std::filesystem::path对象按原样打开文件,例如:

#include <iostream>
#include <fstream>
#include <filesystem>
#include <string>

#include <windows.h>
#include <shlobj.h>

namespace fs = std::filesystem;

void read_file(fs::path File);

fs::path GetLocalAppdataPath() {
    char szPath[MAX_PATH] = {};
    SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath);
    return fs::path(szPath);
}

int main(){
    for (auto entry: fs::recursive_directory_iterator(GetLocalAppdataPath())){
        try{
            if (entry.path().extension() == ".txt"){
                read_file(entry.path()); // OK
            }
        }
        catch (const fs::filesystem_error&){
            continue;
        }
    }
    
    return 0;
}

void read_file(fs::path File){
    std::ifstream rf(File);
    if (!rf.is_open()){
        std::cout << "File: " << File << " Cannot be opened" << std::endl;
        return;
    }
    std::string Buffer;
    while (std::getline(rf, Buffer)){
        std::cout << Buffer << std::endl;
    }
    rf.close();
    std::cout << "File Closed" << std::endl;
}

相关问题