730 Stimmen

Lesen der gesamten ASCII-Datei in C++ std::string

Ich muss eine ganze Datei in den Speicher einlesen und sie in eine C++ std::string .

Wenn ich es in eine Tabelle einlesen würde char[] dann wäre die Antwort sehr einfach:

std::ifstream t;
int length;
t.open("file.txt");      // open input file
t.seekg(0, std::ios::end);    // go to the end
length = t.tellg();           // report location (this is the length)
t.seekg(0, std::ios::beg);    // go back to the beginning
buffer = new char[length];    // allocate memory for a buffer of appropriate dimension
t.read(buffer, length);       // read the whole file into the buffer
t.close();                    // close file handle

// ... Do stuff with buffer here ...

Jetzt möchte ich genau das Gleiche tun, aber mit einer std::string anstelle einer char[] . Ich möchte Schleifen vermeiden, d. h. ich nicht wollen:

std::ifstream t;
t.open("file.txt");
std::string buffer;
std::string line;
while(t){
std::getline(t, line);
// ... Append line to buffer and go on
}
t.close()

Irgendwelche Ideen?

3 Stimmen

Es wird immer eine Schleife involviert sein, aber sie kann als Teil der Standardbibliothek implizit sein. Ist das akzeptabel? Warum versuchen Sie, Schleifen zu vermeiden?

8 Stimmen

Ich glaube, dass der Poster wusste, dass das Lesen von Bytes eine Schleife erfordert. Er wollte nur eine einfache, Perl-Stil schlucken gleichwertig. Dazu musste ich nur wenig Code schreiben.

0 Stimmen

Dieser Code ist fehlerhaft, für den Fall, dass std::string keinen kontinuierlichen Puffer für seine String-Daten verwendet (was erlaubt ist): stackoverflow.com/a/1043318/1602642

2voto

yash101 Punkte 661

Ich habe einen anderen Weg gefunden, der mit den meisten istreams funktioniert, einschließlich std::cin!

std::string readFile()
{
    stringstream str;
    ifstream stream("Hello_World.txt");
    if(stream.is_open())
    {
        while(stream.peek() != EOF)
        {
            str << (char) stream.get();
        }
        stream.close();
        return str.str();
    }
}

1voto

Artem Vorotnikov Punkte 110

Wenn Sie zufällig glibmm können Sie versuchen Glib::file_get_contents .

#include <iostream>
#include <glibmm.h>

int main() {
    auto filename = "my-file.txt";
    try {
        std::string contents = Glib::file_get_contents(filename);
        std::cout << "File data:\n" << contents << std::endl;
    catch (const Glib::FileError& e) {
        std::cout << "Oops, an error occurred:\n" << e.what() << std::endl;
    }

    return 0;
}

2 Stimmen

Imho: Obwohl dies funktioniert, könnte die Bereitstellung einer "glib"-Lösung, die das plattformunabhängige Äquivalent zur Büchse der Pandora ist, enorm verwirren, umso mehr, wenn es eine einfache CPP-Standardlösung dafür gibt.

0voto

chunkyguy Punkte 3362

Ich könnte es so machen:

void readfile(const std::string &filepath,std::string &buffer){
    std::ifstream fin(filepath.c_str());
    getline(fin, buffer, char(-1));
    fin.close();
}

Wenn dies etwas ist, das verpönt ist, lassen Sie mich bitte wissen, warum.

13 Stimmen

Char(-1) ist wahrscheinlich kein portabler Weg, um EOF zu bezeichnen. Außerdem sind getline()-Implementierungen nicht verpflichtet, das "ungültige" EOF-Pseudozeichen als Begrenzungszeichen zu unterstützen, denke ich.

0 Stimmen

@reddish ist es in der Tat nicht, in modernem C++ ist es besser zu verwenden std::char_traits<char>::eof() . Wenn jemand noch einen alten Compiler verwendet... <cstdio> を含む EOF Makro.

-6voto

KeithB Punkte 15939

Ich glaube nicht, dass Sie dies ohne eine explizite oder implizite Schleife tun können, ohne zuerst in ein char-Array (oder einen anderen Container) zu lesen und dann die Zeichenkette zu konstruieren. Wenn man die anderen Fähigkeiten eines Strings nicht braucht, könnte man es mit vector<char> auf die gleiche Weise, wie Sie derzeit eine char * .

20 Stimmen

-1 Nicht wahr... Siehe oben

3 Stimmen

Fairerweise muss man sagen, dass alle obigen Antworten in irgendeiner Weise eine Schleife enthalten, sei es als Boilerplate oder hinter den Kulissen ...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X