我在编写一个读取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;
}
Run Code Online (Sandbox Code Playgroud)
脚本调用:
jmcomets $ ./test -g -l
jmcomets $ ls -l
-rw-rw-r-- 1 jmcomets jmcomets 0 Nov 14 22:41 -l
Run Code Online (Sandbox Code Playgroud)
failbit您可以在例外标志中设置ifstream:
std::ifstream log;
log.exceptions ( std::ifstream::failbit );
try {
log.open ("test.txt");
}
catch (std::ifstream::failure e) {
std::cout << "Exception opening/reading file\n";
}
Run Code Online (Sandbox Code Playgroud)
我已经测试过,如果文件无法打开,ifstream则会抛出异常,例如找不到文件,没有读取权限。failure它将以只读方式打开。
| 归档时间: |
|
| 查看次数: |
10816 次 |
| 最近记录: |