【发布时间】:2012-11-15 08:09:30
【问题描述】:
我在编写读取 apache 日志的 Linux 控制台应用程序时遇到了一些问题。
我需要处理 bash 脚本参数,最后一个是日志文件的路径。 我的问题是,如果文件不存在,我想抛出一个异常。
但是当我尝试以只读模式打开文件时,它会创建文件而不是失败!
代码如下:
// logreader.h
#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
#include <stdexcept>
class LogReader
{
public:
LogReader(int, const char **);
virtual ~LogReader();
// ...
private:
std::ifstream log_;
};
// logreader.cpp
#include <logreader.h>
LogReader::LogReader(int argc, const char ** argv):
log_()
{
log_.exceptions(std::ifstream::failbit | std::ifstream::badbit);
for (int i = 1; i < argc; ++i)
{
std::string arg(argv[i]);
if (i == argc - 1)
{
try
{
log_.open(arg.c_str(), std::ifstream::in);
}
catch (std::ifstream::failure)
{
throw std::runtime_error("The file " + arg + " wasn't opened");
}
}
}
}
LogReader::~LogReader()
{
}
// main.cpp
#include <logreader.h>
int main(int argc, const char ** argv)
{
LogReader(argc, argv);
return 0;
}
脚本调用:
jmcomets $ ./test -g -l
jmcomets $ ls -l
-rw-rw-r-- 1 jmcomets jmcomets 0 Nov 14 22:41 -l
【问题讨论】:
-
请创建一个完整的、最小的程序来演示错误。请参阅sscce.org 了解更多信息。
-
你怎么知道对
log.open()的调用创建了文件? -
您的代码无法编译。更重要的是,当它被修改为编译时,它并没有显示你看到的错误。您看到的问题不在于 that 代码,而在于您的程序中的一些 other 代码。这就是为什么创建一个最小的完整程序,例如sscce.org,是一种非常有价值的技术。
-
LogReader ctor 中有一个错误:它应该是
LogReader(int, const char **)。当我修复它时,代码仍然可以正常工作。我什至用那个时髦的文件名-l对其进行了测试,它可以工作。 -
好的,我修复了问题的代码并对其进行了测试,它按预期工作。问题实际上出在其他地方,我会尝试使用调试器来修复它。