Autor Thema: C++ ifstream <- ofstream  (Gelesen 3880 mal)

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« am: 19. May 2005, 13:30 »
Ich habe einen ifstream für einen Inputfile und einen ofstream für den Outputfile. Nach einer Funktion möchte ich dass der erstellte Outputfile zum neuen Inputfile wird. Der Outputfile wird tempx genannt. x steht dabei für eine Zahl die immer weiter erhöht wird. Also etwas so:

Out:        In:
temp0     File.txt
temp1     temp0
temp2     temp1
...


Dafür verwende ich diesen Code:

// Alten Input-File schließen
FileIn->close();

// Alten Outputfile schließen
FileOut->close();

// Erstellten Temp-File zum Inputfile machen
char buffer[200];
int j = sprintf(buffer, "temp%d", iTempFileNum);
buffer[j] = '\0';
FileIn->open(buffer);

// Temp-File Anzahl erhöhen
iTempFileNum++;

// Neuer Temp-File ist jetzt der Outputfile
char buffer2[200];
int k = sprintf(buffer2, "temp%d", iTempFileNum);
buffer2[k] = '\0';
FileOut->open(buffer2);

Das scheint auch problemlos zu funktionieren, aber das Lesen beginnt danach am Dateiende. Das heißt man bekommt sofort ein eof.
Also die Frage: Wie kann ich den "Cursor" an den Dateianfang setzen.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #1 am: 19. May 2005, 17:26 »
Da du ja scheinbar eigene Klasse gebastelt hast, wäre es wohl interressant welche Methode du benutzt um auf die Dateien zuzugreifen. fopen, open, was anderes?
*post*

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 19. May 2005, 19:04 »
Ich verwende einfach die Standard fstreams von C++ unter Windows. Also so:

; Files öffnen
ifstream *FileIn;
ofstream *FileOut;
FileIn = new ifstream("File.txt");
FileOut = new ofstream("temp0");

; Zeichen lesen
char ch;
FileIn->get(ch);

; Zeichen schreiben
FileOut->put('A');

Das ganze hat also gar nixhts mit OS-Dev zu tun.

So weit binich inzwischen:
Das hier sollte dafür sorgen, dass man beim Dateianfang anfängt:
FileIn->seekg(0, ios_base::beg);
Aber das schlägt immer fehl.

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 19. May 2005, 19:08 »
Wenns nix mit OSDev zu tun hat wäre es sinnvoll gewesen es in OffTopic zu posten.
<- Verhasst, Verdammt, Vergöttert

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 19. May 2005, 19:10 »
Zitat von: The-Programmerfish
Wenns nix mit OSDev zu tun hat wäre es sinnvoll gewesen es in OffTopic zu posten.

Ja ok. Aber es hat ja schon was mit programmieren zu tun. Und im Offtopic-Bereich gibts ja fast gar nichts in der Richtung. Aber von mir aus kanns auch verschoben werden  :wink:

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 23. May 2005, 13:24 »
Hat niemand ne Idee? Im Prinzip müsste man nur an den Dateianfang wechseln. Afaik geht das mit
FileIn->seekg(0, ios_base::beg);
Aber das will irgendwie nicht gehen.

Sol als Motivation zum Antworten:  :wink:
Das ganze brauch ich für den Compiler (eigentlich erstmal dem Präprozessor): Der soll das Ergebnis von einem Schritt (z.B. Includes auflösen) in einen Temp-File schreiben und den danach als Inputfile verwenden. Man könnte das ganze natürlich nur im RAM zwischenspeichern, aber dann kann man nicht das Ergebnis sehen.

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 27. May 2005, 12:23 »
Ich habs jetzt gelöst:

Vorher habe ich das so gemacht:

char buffer[200];

FileIn->close();
FileOut->close();

// In buffer etwas schreiben...

FileIn->open(buffer);

// Wieder was in Buffer schreiben...

FileOut->open(buffer);


Jetzt mach ich das so und es geht:

char buffer[200];

FileIn->close();
FileOut->close();
delete FileIn;
delete FileOut;

// In buffer etwas schreiben...

FileIn = new ifstream(buffer);

// Wieder was in Buffer schreiben...

FileOut = new ofstream(buffer);

 

Einloggen