Frage

Ich brauche eine schnelle einfache Möglichkeit, einen String aus einer Datei in Standard C ++ zu erhalten. Ich kann meine eigenen schreiben, aber will nur wissen, ob es bereits eine Standardmethode ist in C ++.

Entspricht dies, wenn Sie wissen, Kakao:

NSString *string = [NSString stringWithContentsOfFile:file];
War es hilfreich?

Lösung

Wir können es tun, aber es ist eine lange Zeile:

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

using namespace std;

int main()
{
    // The one-liner
    string fileContents(istreambuf_iterator<char>(ifstream("filename.txt")), istreambuf_iterator<char>());

    // Check result
    cout << fileContents;
}

Editiert: verwenden "istreambuf_iterator" anstelle von "istream_iterator"

Andere Tipps

Es ist fast möglich, mit einem istream_iterator (3 Zeilen!)

#include <iostream>
#include <fstream>
#include <iterator>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    ifstream file("filename.txt");
    string fileContents;

    copy(istreambuf_iterator<char>(file),
              istreambuf_iterator<char>(),
              back_inserter(fileContents));
}

Herausgegeben -. Wurde der Zwischenkette Strom befreien, kopiert nun direkt in die Schnur, und jetzt mit istreambuf_iterator, die Leerzeichen (dank Martin York Ihren Kommentar)

ignoriert

Der Standard C ++ Bibliothek bietet keine Funktion, dies zu tun.

Best ich tun kann, ist 5 Zeilen:

#include <fstream>
#include <vector>
using namespace std;

ifstream f("filename.txt");
f.seekg(0, ios::end);
vector<char> buffer(f.tellg());
f.seekg(0, ios::beg);
f.read(&buffer[0], buffer.size());

Wie wäre:

#include <fstream>
#include <sstream>
#include <iostream>

using namespace std;

int main( void )
{
  stringstream os(stringstream::out);
  os << ifstream("filename.txt").rdbuf();
  string s(os.str());
  cout << s << endl;
}

Wenn Sie es wie folgt tun (aber richtig schön anders als unten eingewickelt), können Sie in der Datei zu lesen, ohne sich Gedanken über eine 0x1A Byte in der Datei (zum Beispiel) kurz, um das Lesen der Datei zu schneiden. Die bisher vorgeschlagenen Methoden auf einem 0x1A ersticken werden (zum Beispiel) in einer Datei.


#include <iostream>
#include <cstdio>
#include <vector>
#include <cstdlib>
using namespace std;

int main() {
    FILE* in = fopen("filename.txt", "rb");
    if (in == NULL) {
        return EXIT_FAILURE;
    }
    if (fseek(in, 0, SEEK_END) != 0) {
        fclose(in);
        return EXIT_FAILURE;
    }
    const long filesize = ftell(in);
    if (filesize == -1) {
        fclose(in);
        return EXIT_FAILURE;
    }
    vector<unsigned char> buffer(filesize);
    if (fseek(in, 0, SEEK_SET) != 0 || fread(&buffer[0], sizeof(buffer[0]), buffer.size(), in) != buffer.size() || ferror(in) != 0) {
        fclose(in);
        return EXIT_FAILURE;
    }
    fclose(in);
}

Aber, yeh, es ist nicht ein bereits implementiertes 1-liner though.

Edit: 0x1A war kein gutes Beispiel, wie ios_base :: binary wird, dass decken. Doch selbst dann Ströme C ++ oft geben Sie mir Schwierigkeiten, wenn in PNG-Dateien auf einmal mit .lesen () zu lesen. die C Art und Weise unter Verwendung von besser funktioniert. Kann einfach nicht ein gutes Beispiel um zu zeigen, daran erinnern, warum. Es war wahrscheinlich mit .lesen () in einer Schleife eine binäre Datei in Blöcken ing statt, dass ein Problem mit C ++ Streams sein kann. Also, ignorieren diesen Beitrag.

std::string temp, file; std::ifstream if(filename); while(getline(if, temp)) file += temp;

Es ist nicht nur eine kurze oder Single-Anweisung Linie, aber es ist eine Zeile und es ist wirklich nicht so schlimm.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top