Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
OutputDevice_File.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2004-2026 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
20// An output device that encapsulates an ofstream
21/****************************************************************************/
22#include <config.h>
23
24#include <iostream>
25#include <cstring>
26#include <cerrno>
27#ifdef HAVE_ZLIB
28#include <foreign/zstr/zstr.hpp>
29#endif
31#include <utils/xml/XMLSubSys.h>
33#include "OutputDevice_File.h"
34
35
36// ===========================================================================
37// method definitions
38// ===========================================================================
39OutputDevice_File::OutputDevice_File(const std::string& fullName, const bool binary)
40 : OutputDevice(0, fullName) {
41 if (fullName == "/dev/null") {
42 myAmNull = true;
43#ifdef WIN32
44 myFileStream = new std::ofstream("NUL");
45 if (!myFileStream->good()) {
46 delete myFileStream;
47 throw IOError(TLF("Could not redirect to NUL device (%).", std::string(std::strerror(errno))));
48 }
49 return;
50#endif
51 }
52 const std::string& localName = XMLSubSys::transcodeToLocal(fullName);
53 std::ios_base::openmode mode = std::ios_base::out;
54 if (binary) {
55 mode |= std::ios_base::binary;
56 }
57#ifdef HAVE_ZLIB
58 if (fullName.length() > 3 && fullName.substr(fullName.length() - 3) == ".gz") {
59 try {
60 myFileStream = new zstr::ofstream(localName.c_str(), mode);
61 } catch (strict_fstream::Exception& e) {
62 throw IOError("Could not build output file '" + fullName + "' (" + e.what() + ").");
63 } catch (zstr::Exception& e) {
64 throw IOError("Could not build output file '" + fullName + "' (" + e.what() + ").");
65 }
66 }
67#else
68 UNUSED_PARAMETER(compressed);
69#endif
70 if (myFileStream == nullptr) {
71 myFileStream = new std::ofstream(localName.c_str(), mode);
72 }
73 if (!myFileStream->good()) {
74 delete myFileStream;
75 throw IOError("Could not build output file '" + fullName + "' (" + std::strerror(errno) + ").");
76 }
77}
78
79
81 // we need to cleanup the formatter first, because it still might have cached data
82 delete myFormatter;
83 myFormatter = nullptr;
84 delete myFileStream;
85}
86
87
88/****************************************************************************/
#define TLF(string,...)
Definition MsgHandler.h:306
bool myAmNull
am I redirecting to /dev/null
std::ostream * myFileStream
The wrapped ofstream.
OutputDevice_File(const std::string &fullName, const bool binary=false)
Constructor.
~OutputDevice_File()
Destructor.
Static storage of an output device and its base (abstract) implementation.
OutputFormatter * myFormatter
The formatter for XML, CSV or Parquet.
static std::string transcodeToLocal(const std::string &utf8String)
convert a string from UTF-8 to the local codepage
Exception class thrown by failed operations.
const char * what() const noexcept
Exception class thrown by failed zlib operations.
Definition zstr.hpp:36
#define UNUSED_PARAMETER(x)