我是一个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";
}
我已经尝试通过类型转换来解决这个问题,但也许我用了错误的类型?
2条答案
按热度按时间wgxvkvu91#
首先使用
path::string()
或path::u8string()
(UTF-8)来获取路径,然后可以使用string::c_str()
方法。2guxujil2#
你的
read_file()
函数需要一个(非常量!)char*
指针(在函数参数中,像char[N]
这样的数组只是像char*
这样的指针的语法糖)。你传递给它一个std::filesystem::path
对象,但是没有定义从system::filesystem::path
到char*
的转换,因此编译器错误。然而,
std::filesystem::path
确实有一个到std::wstring
(仅在Windows上,您似乎正在运行)或std::string
(在Posix系统上)的隐式转换。它也有公共(w|u8|u16|u32)string()
方法。所以,在你的例子中,如果你让
read_file()
接受一个const char*
指针(这就是fopen()
所期望的),你可以把entry.path.string().c_str()
的返回值传递给它,例如:如果你使用的是C++风格的文件I/O(即通过
std::ifstream
),那么你可以使用std::filesystem::path
对象按原样打开文件,例如: