ifstream创建文件,如果它不存在

Jea*_*ets 5 c++ linux std

我在编写一个读取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)

Qua*_*key 2

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它将只读方式打开。