我目前正在尝试创建一个简单的函数来读取文件的内容并将其存储到
std::string
或 char
数组中。我遇到了这样的问题:数据在函数内读取完全正常,但在调用函数时似乎被删除/释放。
我已将这个问题隔离到一个小程序中:
入口.cpp
#include <string>
#include <fstream>
#include <iostream>
const char* ReadFile(const std::string& path) {
std::ifstream file;
try {
file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
file.open(path);
if (!file.is_open()) {
throw;
}
}
catch (std::exception e) { //file does not exist
std::string errmsg = "Unable to open file at path: " + path;
std::cout << errmsg << std::endl;
throw new std::exception(errmsg.c_str());
}
std::string contents;
try {
contents = std::string{ std::istreambuf_iterator<char>{file}, {} };
}
catch (const std::ifstream::failure& e) {
std::cout << path << std::endl;
std::cout << e.what() << std::endl;
throw e;
}
std::cout << "----------------" << std::endl;
std::cout << "in the function:" << std::endl;
std::cout << contents.c_str() << std::endl;
return contents.c_str();
}
int main() {
const char* a = ReadFile("test.txt");
std::cout << "----------------" << std::endl;
std::cout << "in main" << std::endl;
std::cout << a << std::endl;
return 0;
}
测试.txt
example content
dfhfrdhdf
h
srjed
jt
tejk
e
tktre
krtk
控制台日志
----------------
in the function:
example content
dfhfrdhdf
h
srjed
jt
tejk
e
tktre
krtk
----------------
in main
▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
我尝试使用
strcpy
复制函数内部的数据,这给了我各种内存错误(尽管我可能使用错误)。
您正在返回一个指向字符串内容的指针,但不幸的是,当您退出函数时,该字符串被销毁,因此您的指针指向垃圾。
但是答案很简单,只需将函数更改为返回一个
std::string
即可。
std::string ReadFile(const std::string& path) {
...
return contents;
}
int main() {
std::string a = ReadFile("test.txt");
...
std::cout << a << std::endl;
}
如果出于某种原因您确实需要一个指向字符串的
char*
指针,请在您真正需要它时调用 .c_str()
,而不是之前。