Diskussion:C++-Programmierung: Dateizugriff

Seiteninhalte werden in anderen Sprachen nicht unterstützt.
Aus Wikibooks

Mir ist aufgefallen, dass "Quelldatei >> stringvariable;" nur bis zum ersten Leerzeichen liest. Vielleicht kann man das fixen. --Gronau 13:01, 14. Feb. 2007 (CET)[Beantworten]

Fstream?[Bearbeiten]

Bei mri kommt beim Kompilieren des Beispieles zum Wahlfreienzugriff die meldung das die Klasse ifstream keine Mehoden Putg() und setp() hat. mit fsram funktioniert das. Liegt das an der fstram lib (minGW vom 9.11.07) oder sollte das fstream heißen? Ichbitte jemand der das weiß das zu bearbeiten

Dateistream.write[Bearbeiten]

Bei mir kommt immer der Fehler: »struct std::ifstream« hat kein Element namens »write«, wenn ich versuche, das "Random Access"-Beispiel zu kompilieren.

Kritikpunkte[Bearbeiten]

Nachdem ich die Seite gelesen habe, hier mein Senf dazu:

  • Es gibt kein ANSI-C++, nur ISO-C++. Und das kennt sehr wohl std::fstream.
  • Warum wird erst gezeigt, wie man Dateien mit i.open() öffnet, später wird die Datei dann gleich im Konstruktor geöffnet, ohne dass auf die Unterschiede und Vor- und Nachteile hingewiesen wird.
  • Muss man bei Windows Leerzeichen in Dateinamen tatsächlich mit \ quoten? Ich bezweifle das stark. Dann ist "\ " aber ein Fehler, da das kein gültiges Zeichenkettenliteral ergibt.
  • Der mode-Parameter bei den Konstruktoren und bei .open() ist optional.
--RokerHRO 03:25, 23. Feb. 2008 (CET)[Beantworten]

Komplette Datei in eine Variable speichern, bzw. bestimmte daten in Variablen speichern[Bearbeiten]

Da ich schon sehr oft google danach gefragt habe, aber nicht wirklich einfache beispiele gefunden habe frage ich:

wie kann man am einfachsten ganze Dateien (text) einlesen und verarbeiten und ggf die geänderte datei wieder speichern.

Grade für einen Anfänger sind mache Funktionen die einfach in den Raum geworfen werden unverstäbdlich und google bietet da auch gleich mehrere mögliche funktionsweisen der funktionen.

ich fand folgenden code

            FILE *fz;
            char *buffer = NULL;
            int iFileSize;

            fz = fopen("text.txt", "rb");
            if(fz != NULL)
            {
                fseek(fz, 0, SEEK_END); // was passiert hier?
                iFileSize = ftell(fz); //ermittlung der dateigröße?
                buffer = (char*)malloc(iFileSize); //was macht dieser schritt? reserviert doch im Ram platz für einen char oder?
                fseek(fz, 0, SEEK_SET); // wass passiert hier?
                fread(buffer, 1, iFileSize, fz);
                fclose(fz);
            }

nur liefert buffer nicht immer eine gute Ausgabe. -- 188.109.224.39 21:07, 31. Jan. 2012 (CET)[Beantworten]

Wie bereits oben auf der Seite gesagt wird, wurde das Buch zu C++ insgesamt überarbeitet. Dieses (kurze) Kapitel entfällt dadurch, allerdings gibt es das neu vorgesehene Kapitel Ein- und Ausgabe für Dateien noch nicht. Es dauert eben seine Zeit, bis ein Autor sein Buch vervollständigen kann. (Das geschieht immer ehrenamtlich, neben der eigentlichen Berufstätigkeit oder dem Studium.) Bitte hab' dafür Verständnis.
Zu deinen konkreten Fragen:
  1. fseek setzt den Dateizeiger fz an eine bestimmte Position in der Datei: an der ersten Stelle 0 Bytes vom Dateiende entfernt, an der zweiten Stelle um 0 Bytes vom Dateianfang entfernt.
  2. ftell: Genauer handelt es sich um die Position, an der sich der Dateizeiger innerhalb des Streams befindet. Da er gerade auf das Dateiende gesetzt worden war, ist es tatsächlich die Dateigröße.
  3. malloc: Nicht ganz. Im RAM wird Platz für einen Buffer reserviert. Dieser Buffer wird deklariert als Zeiger (!) auf ein Zeichen oder eine Zeichenfolge der betreffenden Länge. Faktisch geht es tatsächlich darum, den nötigen Platz für eine Zeichenkette zu reservieren.
Dass mit buffer keine gute Ausgabe erreicht wird, sollte klar sein. Denn es handelt sich um eine unstrukturierte Zeichenfolge, in der an irgendwelchen Stellen auch die Zeichen x0D und x0A enthalten sind. Für eine bessere Ausgabe bräuchtest du auch eine bessere Eingabe, also beispielsweise eine Routine, die die Datei zeilenweise einliest, oder eine Trennung der Ausgabe durch CR/LF. Soweit gehen meine Kenntnisse allerdings nicht, dass ich dir etwas in einer gängigen Bibliothek nennen könnte; in den Kapiteln des Buches über Arrays (Felder) und Zeichenketten habe ich fast nichts dazu gefunden. -- Jürgen 09:27, 1. Feb. 2012 (CET)[Beantworten]

Danke für sie schnelle Antwort :) , ich weiss wie das Wikisystem funktioniert und ich ziehe meinen Hut vo dehnen die sich die Zeit nehmen, dies mit Inhalt zu füllen.

eine zeilenweise Einlesung der Datei mit fstream habe ich hinbekommen. Nur das Problem ist, wenn die Größe der einzulesenden Daten nicht bekannt ist kann man ja auch nicht passend viel Platz reserviern.

da ich schon viel in PHP Programiert habe dachte ich natürlich man könne auch einfach arrays dynamisch erweitern PHP beispiel:

$daten = array();
while(irgendwas){
     $daten[] = $nochetwas;
}

arrays so in c++ zuerweitern führt zu merkwürdigen kommentaren vom Compiler.

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main()
{
    ifstream f;  // Datei-Handle
    string s;
    f.open("test.txt");       // Öffne Datei
    while (!f.eof())          // Solange noch Daten vorliegen
    {
        getline(f, s);        // Lese eine Zeile
        cout << s << endl;    // Zeige sie auf dem Bildschirm
        // in PHP würde ich hier sowas schreiben wie: $daten .= s; oder $daten[] = s;
        // kann mein in c++ einen string auch einfach verketten?
    }
    f.close();                // Datei wieder schließen
}

188.109.224.39 15:15, 2. Feb. 2012 (CET)[Beantworten]

Bitte verzichte möglichst darauf, etwas unter C/C++/C# ähnlich zu erledigen wie unter PHP. Im Zusammenhang mit den hier besprochenen Routinen sind vor allem zwei Unterschiede wichtig:
  • C-Varianten (C, C++) und .NET-Varianten (u.a. C#) achten strikt auf Typengenauigkeit.
  • Bei C-Varianten ist nur der Programmierer für die Verwaltung des Arbeitsspeichers zuständig. (Das gilt theoretisch für jede Programmiersprache, aber bei vielen anderen übernehmen IDE und Compiler einen Großteil dieser Arbeit.)
Bei deinen Nachfragen komme ich mit meinen C-Kenntnissen nicht weiter; ich kann nur Tipps geben, anhand derer du in den Bibliotheken suchen musst.
  • Unter C/C++ gibt es theoretisch keine Strings, nur Zeiger auf char-Array. Das hat Auswirkungen auf viele Maßnahmen.
  • Für Stringverkettung gibt es Funktionen wie concat. Aber wie die Speicherverwaltung flexibel gehandhabt werden kann, weiß ich nicht.
  • Vielleicht gibt es die Möglichkeit, ein Array mit einer bestimmten Größe (z.B. für 100 Zeilen) zu initialisieren und bei Bedarf zu vergrößern, ohne dass der bisher eingelesene Inhalt verlorengeht.
Trotzdem viel Erfolg! -- Jürgen 15:47, 2. Feb. 2012 (CET)[Beantworten]


Ich habe eine mögliche lösung mit fstream gefunden:

/*ausgabe*/

            ifstream f;  // Datei-Handle
            string s;
            string ausgabe;
            f.open("text.txt");       // Öffne Datei
            while (!f.eof())          // Solange noch Daten vorliegen
            {
                getline(f, s);        // Lese eine Zeile
                ausgabe += s + "\r\n";
            }
            f.close();

            // str 2 char (nur bei bedarf wenn man einen char braucht)
            char * buffer = new char[ausgabe.length()];
            strcpy(buffer,ausgabe.c_str());

/*eingabe*/

            fstream f;
            f.open("text.txt", ios::out);
            f << buffer << endl;
            f.close();

vermutlich gibt es einen eleganteren weg, aber es funktioniert 188.109.224.39 21:02, 2. Feb. 2012 (CET)[Beantworten]