用c++将信息写入文件的函数
functions to write information to a file in C++
我一直在为学校做一个项目,我遇到了一个问题。我试图避免硬编码我的程序中的一切,我的部分要求是使用fstream。这是抛出错误的原因。我使用g++作为我的编译器。
void order::printToFile(string file)
{
ofstream output;
try
{
output.open(file, ios::app);
}
catch(...)
{
cerr << "An error has occurred";
}
output << this->info.orderID << setw(10) << this->info.type << setw(10) << this->info.quantity << setw(10) << this->info.zip << setw(10) << (this->info.shipCost + this->info.wholesale) << setw(10) << this->info.profit << endl << endl;
output.close();
}
显示如下错误:
没有匹配函数调用'std::basic ofstream<char>::open( std::string&, const openmode&)'
没有匹配的函数调用
'std::basic ofstream<char>::open( std::string&, const openmode&)'
"no matching function"错误表示编译器搜索了但没有找到与调用站点提供的实参匹配的重载。open()
在c++ 11之前有一个过载,它占用了char const*
类型的缓冲区。这已经更新了,除了第一个重载之外,open()
现在支持std::string const&
类型的参数。
问题一定是你的编译器不支持c++ 11。将-std=c++11
添加到命令行应该可以解决这个问题。另一方面,如果不能这样做,则可以使用c_str()
:
output.open(file.c_str(), ios::app);
// ^^^^^^^^
你应该知道的另一件事是IOStreams在默认情况下是不抛出异常的。相反,它们以被称为"流状态"的位掩码类型的形式反映流错误。它可以通过使用流支持的布尔操作符方法来访问。
您可以通过在exceptions()
掩码中设置适当的位来启用异常,但我不建议在这样一个简单的示例中使用它。只要在打开流后检查它就足够了:
if (std::ofstream output(file.c_str(), std::ios_base::app)) {
output << "...";
}
else {
std::cerr << "An error has occurred.";
}
最后,流不需要手动关闭。当定义它们的作用域结束时,将调用它们的析构函数,从而自动释放文件资源。调用close()
只需要在您希望查看它是否工作的情况下,或者如果您不再需要该文件并希望立即刷新输出。
也许你的编译器不是c++ 11。试着改变
output.open(file, ios::app);
output.open(file.c_str(), ios::app);
接受std::string
实参的ofstream
构造函数是在c++ 11中添加的。假设您的编译器支持它,您需要启用c++ 11模式(gcc和clang的-std=c++11
)。否则,将函数调用更改为:
output.open(file.c_str(), ios::app);
另外,请注意,如果ofstream
打开文件失败,它不会导致异常,除非您显式启用异常。
output.exceptions(std::ofstream::failbit);
output.open(file.c_str(), ios::app); // will throw exception if open fails
另一个选项是打开文件,然后检查是否成功
output.open(file.c_str(), ios::app);
if(!output) {
// error occurred, handle it
}
我在Ubuntu 14.04上使用g++ 4.8.2版本时可以正常工作。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void printToFile (string fname) {
ofstream output;
try {
// NOTE: passing fname.c_str() not just fname
output.open (fname.c_str(), ios::app);
} catch (std::exception e) {
cout << "err occurred: " << e.what() << endl;
}
output << "foo bar baz" << endl;
output.close ();
}
int main () {
printToFile ("foo.txt");
return 0;
}
我相信你的问题是你试图用std::string
而不是char *
作为第一个参数来调用open
。参见上面代码中的注释
- C++ gmock - 我们如何在单元测试 cpp 文件中读取/获取 cpp 文件函数的参数值
- 使用其他头文件函数的头文件
- 创建文件函数是否可以打开仅在WinObj实用程序中的全局目录下列出的设备的句柄?
- 如何指定创建文件函数获取未缓存的结果?
- 标准库头文件函数原型的实现是如何用 c++ 编写的?
- 如何将类对象作为对另一个头文件函数的引用传递
- 读取文件函数lpbuffer和字节以读取澄清
- C++ - 未定义的对多个文件函数的引用
- 使用C++的可视 Unicode 文件函数
- C 创建文件函数错误
- WinAPI 创建文件函数 2.
- 具有CREATE_ALWAYS处置的创建文件函数
- 重写c库文件函数
- 如何使用客户端调用堆栈中的地址从 PDB 检索文件/函数/行号?
- 通过头文件函数将遍历的数据从二进制搜索树加载到Vector中
- 需要帮助无法弄清楚为什么我的头文件函数声明不起作用
- 是否可以在不使用文件函数的情况下使用代码块从文件运行某些用例测试?
- 如何用c++文件函数读写8位整数单位形式的数据
- 在c++中读文件函数如何识别文本文件的结束
- 使用Windows API的c++文件函数