In einem Projekt muss ich eine Datei lesen, und ich muss mit der Anzahl der Zeichen in einer Datei arbeiten, und gibt es eine Möglichkeit, die Anzahl der Zeichen zu erhalten, ohne sie Zeichen für Zeichen zu lesen (sonst muss ich das tun) lese die Datei zweimal, einmal um die Anzahl der Zeichen zu finden.)
Ist es überhaupt möglich?
Sie können dies versuchen:
%Vor%Dies gibt jedoch die Anzahl der Bytes in der Datei zurück, nicht die Anzahl der Zeichen . Es ist nicht dasselbe, es sei denn, die Codierung ist bekanntlich ein Byte pro Zeichen (z. B. ASCII).
Sie müssen die Datei an den Anfang zurückspulen, nachdem Sie die Größe gelernt haben:
%Vor%Ja.
Suchen Sie bis zum Ende die Position des Endes, das die Größe ist.
%Vor%In C ++ hat der Stream die gleiche Funktionalität:
%Vor% Ich denke, Sie suchen wahrscheinlich nach einer dynamischen Speicherlösung . Was Sie tatsächlich gefragt haben, ist "Gibt es eine Möglichkeit, die Anzahl der Zeichen in einer Datei zu erhalten, ohne sie zu lesen?". Die Antwort (angenommen ein Byte pro Zeichen) ist ja, Sie können den stat
Aufruf verwenden, um die Dateigröße zu erhalten, und die Dateigröße in Bytes ist die Anzahl der Zeichen. Mit UTF-8 ist die Antwort nein, aber lassen wir das für den Moment beiseite, da gerade-lernende Informatiker sich normalerweise keine Gedanken über Internationalisierung machen.
Ich denke, der Grund, warum Sie wissen wollen, wie viele Zeichen es gibt, ist, dass Sie genügend Speicherplatz haben, um alle zu speichern. Sie müssen nicht wissen, wie groß die Datei ist, um das Ganze zu speichern.
Wenn Sie ein std::vector<char>
haben, kann es anfangen, zehn Zeichen zu halten, dann wächst es, um zwanzig, dann zehntausend zu halten ... Und wenn Sie mit dem Lesen der Datei fertig sind, wird es sie alle sogar halten obwohl du nie wusstest, wie viele es sein würden.
Aus der Spitze meines Kopfes ist so ein Blick auf die Dateigröße und dividieren, die wie viele Bytes ein einzelnes Zeichen ist?
Beim Umgang mit Leerzeichen und Endzeilen treten Probleme auf.
Die einfache Antwort lautet nein. Genauer gesagt ist es systemabhängig: unter
Unix, ist es möglich (z. B. mit stat
); unter Windows ist es nicht
möglich für eine Textdatei, aber wenn Sie die Datei im Binärformat lesen,
Es gibt eine Funktion GetFileSize
, die verwendet werden kann.
Obwohl nicht garantiert, unter allen Implementierungen, die ich kenne (für
diese beiden Plattformen), bis zum Ende der Datei suchen, dann tun ein
ftell
, gibt etwas zurück, das bei ausreichender Konvertierung in a
großer integraler Typ, wird die gleichen Ergebnisse wie oben (mit der
gleiche Einschränkungen).
Schließlich: Warum brauchen Sie diese Informationen? Wenn es nur ein zuzuteilen ist
Puffer mit der richtigen Größe, auch mit einer Textdatei, GetFileSize
(und
tell
nach dem Suchen bis zum Ende) wird einen etwas größeren Wert zurückgeben
als die Anzahl der Bytes, die Sie lesen können. Du wirst Puffer leicht sein
überdimensioniert, aber das ist in der Regel kein Problem.