C++报错不存在从const std::string到char*的合适转换函数如何解决
问题原因
报错的核心是类型不匹配:
WriteFiles函数入参要求是const char*类型- 遍历vector拿到的
*it是const std::string类型,C++不会自动将std::string隐式转换为C风格字符串指针
另外存在隐藏问题:你用fgets读取到的文件名末尾会自带换行符\n,如果不提前移除,后续会因为文件名非法导致打开文件失败。
修复方案
直接修复类型不匹配问题
不需要修改WriteFiles函数,只要在调用时手动调用std::string的c_str()方法转换为C风格指针即可,修改调用行代码为:
WriteFiles(it->c_str());
更符合C++规范的优化方案
直接修改WriteFiles的入参类型为const std::string&,不需要手动做类型转换:
// 修改函数的声明和定义即可 void WriteFiles (const std::string& file_name) { std::ofstream file; // C++11及以上版本的ofstream::open支持直接传入std::string类型参数 file.open(file_name, std::ios_base::app); file << "Hello world"; file.close(); }
补充修复文件名带换行的隐藏问题
修改ListFiles函数中插入文件名的逻辑,移除末尾的换行符:
while (!feof(pipe)) { if (fgets(buf, 256, pipe) != NULL) { string fname(buf); // 移除末尾的换行符 if (!fname.empty() && fname.back() == '\n') { fname.pop_back(); } f.push_back(fname); } }
完整修复后可运行代码
#define _CRT_SECURE_NO_WARNINGS #include <string> #include <vector> #include <iostream> #include <fstream> using namespace std; void ListFiles(vector<string>& f) // 列出所有txt文件 { FILE* pipe = NULL; string pCmd = "dir /b /s *.txt "; char buf[256]; if (NULL == (pipe = _popen(pCmd.c_str(), "rt"))) { return; } while (!feof(pipe)) { if (fgets(buf, 256, pipe) != NULL) { string fname(buf); // 移除末尾换行符 if (!fname.empty() && fname.back() == '\n') { fname.pop_back(); } f.push_back(fname); } } _pclose(pipe); } void WriteFiles (const char* file_name) { std::ofstream file; file.open(file_name, std::ios_base::app); // 追加写入不覆盖原有内容 file << "Hello world"; file.close(); } int main() { vector<string> files; ListFiles(files); vector<string>::const_iterator it = files.begin(); while (it != files.end()) { WriteFiles(it->c_str()); // 修复类型转换问题 cout << "找到txt文件:" << *it << endl; it++; } return 0; }
内容的提问来源于stack exchange,提问作者Atrox
相关产品推荐
相关产品推荐

