C++

TSV-Dateien (tab-separierte Werte) in C++ einlesen

Dieses minimale Beispiel zeigt, wie man tab-separierte Dateien (TSV) in C++ einlesen kann. Unser Beispiel nutzt boost::algorithm::split, um jede Zeile in ihre tab-separierten Werte aufzuspalten.

#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost::algorithm;

int main(int argc, char** argv) {
    ifstream fin("test.tsv");
    string line;
    while (getline(fin, line)) {
        // Split line into tab-separated parts
        vector<string> parts;
        split(parts, line, boost::is_any_of("\t"));
        // TODO Your code goes here!
        cout << "First of " << parts.size() << " elements: " << parts[0] << endl;
    }
    fin.close();
}

 

 

Posted by Uli Köhler in C++

C++: Datei Zeile für Zeile lesen (minimales Beispiel)

Dieses minimale Beispiel liest eine Datei mithilfe von std::getline und schreibt dann jede Zeile nach stdout.

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char** argv) {
    ifstream fin("test.tsv");
    string line;
    while (getline(fin, line)) {
        // TODO Hier kannst du die Zeile weiterverarbeiten. Dies ist nur ein Beispiel:
        cout << line << endl;
    }
    fin.close();
}

 

Posted by Uli Köhler in C++

GCC-Fehler ‚Warnung: undefinierter Verweis auf »dlopen«‘ beheben

Wenn GCC beim Linken eine Fehlermeldung wie diese angezeigt wird:

/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/librocksdb.so: Warnung: undefinierter Verweis auf »dlopen«
/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/librocksdb.so: Warnung: undefinierter Verweis auf »dlclose«
/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/librocksdb.so: Warnung: undefinierter Verweis auf »dlerror«
/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/librocksdb.so: Warnung: undefinierter Verweis auf »dlsym«

dann muss zusätzlich noch die dl-Bibliothek gelinkt werden, die die Funktionen zum dynamischen Laden von Symbolen dlopen, dlclose, dlerror & dlsym enthält.

In GCC kann man die dl-Bibliothek mit dem -ldl-Flag linken.

Posted by Uli Köhler in C++

Was tun bei ‚fatal error: stringstream: Datei oder Verzeichnis nicht gefunden‘ in C++?

Problem:

Dein C++-Code enthält eine Zeile wie

#include <stringstream>

da du std::stringstream benutzen möchtest, aber dein Compiler zeigt dir diese Fehlermeldung an:

main.cpp:2:10: fatal error: stringstream: Datei oder Verzeichnis nicht gefunden
 #include 
          ^~~~~~~~~~~~~~
compilation terminated.

Solution:

Der Header heißt sstream, nicht stringstream! Benutze diese #include-Direktive:

#include <sstream>
Posted by Uli Köhler in C++

Dateien löschen mit der C++17-filesystem-Bibliothek

Um eine Datei (zum Beispiel test.txt) in C++ zu löschen benutze remove aus der C++17-filesystem-Bibliothek:

remove("test.txt");

Vollständiges Beispiel:

#include <experimental/filesystem>
using namespace std::experimental::filesystem;

int main() {
    remove("test.txt");
}

Mit GCC musst du die Datei wie Folgt kompilieren:

g++ -o delete-cpp17 delete-cpp17.cpp -lstdc++fs

Die stdc++fs-Bibliothek muss gelinkt werden, um die Funktionen aus der C++17-Filesystem-Bibliothek einzubinden.

remove löscht Verzeichnisse nicht rekursiv, also können nur leere Verzeichnisse gelöscht werden! Benutze für das Löschen eines Verzeichnisses inklusive aller Unterverzeichnisse und darin enthaltenen Dateienremove_all oder lies unseren Post dazu: Dateien und Ordner rekursiv löschen mit der C++17-filesystem-Bibliothek

Posted by Uli Köhler in C++

Dateien und Ordner rekursiv löschen mit der C++17-filesystem-Bibliothek

Um mit der C++17-filesystem-Bibliothek ein Verzeichnis rekursiv zu löschen (zum Beispiel mein-verzeichnis), benutze remove_all:

remove_all("mein-verzeichnis");

Diese Zeile löscht mein-verzeichnis und alle darin enthaltenen Unterverzeichnisse und Dateien (= rekursiv).

Vollständiges Beispiel:

#include <experimental/filesystem>
using namespace std::experimental::filesystem;

int main() {
    remove_all("mein-verzeichnis");
}

Mit GCC musst du die Datei wie Folgt kompilieren:

g++ -o delete-cpp17 delete-cpp17.cpp -lstdc++fs

Die stdc++fs-Bibliothek muss gelinkt werden, um die Funktionen aus der C++17-Filesystem-Bibliothek einzubinden.

Falls du stattdessen nur ein leeres Verzeichnis oder eine einzelne Datei löschen möchtest (ohne Unterverzeichnisse), benutze remove anstatt remove_all oder lies unseren Post dazu: Dateien löschen mit der C++17-filesystem-Bibliothek

Posted by Uli Köhler in C++