Problem: c++ Inhalt einer Textdatei in erstellte Textdatei speichern

CaS

Grünschnabel
Hallo zusammen, ich programmiere seit einer Woche C++ und will ein Programm schreiben was den Inhalt einer Textdatei in eine andere erstelllte Textdatei abspeichert, ich habe auch einen Quellcode und bin, wie ich finde auch schon fast am ende.

DAs Problem ist das das Programm nur eine Zeile des Inhalts der 1.Textdatei in der 2.txt abspeichert ich weiss nicht warum,:( der Inhalt der 1. Textdatei wird in der console hingegen komplett ausgegeben.....
Code:
// Dateiinhalt lesen.cpp: Hauptprojektdatei.

#include <stdafx.h>
#include <fstream>
#include <iostream>
#include <string>

using namespace std;
using namespace System;

int main(array<System::Char ^> ^args)
{
  ifstream datei ("test.txt");

  ifstream datei2;

  char inhalt[1024];

  	if(!datei)    // wenn er die Datei nicht findet.....
	{
	cout << "Datei wurde nicht gefunden" << endl; // ...dann das hier ausgeben
	getchar ();
	return -1;
	}

  datei.seekg(0L, ios::beg); // an Anfang der Datei springen
  
  datei.getline(inhalt); // inhalt der Datei auslesen
 
  datei2.open("beispiel.txt", ios::out); // zweite textdatei erstellen

  datei2.write(inhalt); // inhalt der ersten in die zweite textdatei speichern
  
  datei.close(); // bei Dateien schliessen

  datei2.close(); // 

  cout << înhalt << endl; // Inhalt der 1 Textdatei ausgeben

  getchar();
  return 0;
}
 
Hi.
Mit "fstream" kenne ich mich zwar nicht wirklich aus, aber du könntest es am Anfang ja mal mit einem "File Pointer" versuchen. Die sind leichter handzuhaben, auch wenn du nicht so viele Möglcihkeiten hast. (Ich bin sicher, dass andere dir mit deinem konkretem Problem weiterhelfen können :) )
Das geht ungefähr so:
C++:
char inhalt[1024];
FILE *Datei;
Datei = fopen ( "test.txt", "a" /* "Hinzufügen-Mode" wodurch die Datei außerdem erstellt wird, falls sie nicht vorhanden ist */ );
fclose ( Datei );
Datei = fopen ( "beispiel.txt", "r" /* read */ );
fgets ( inhalt, 1024, Datei );
fclose ( Datei );
Datei = fopen ( "test.txt", "a" );
fputs ( inhalt, Datei );
fclose ( Datei );
Ich hab auch noch ein Video gefunden, dass die eventuell weiterhilft:
http://www.youtube.com/watch?v=2bHxgbcHwWE

Viel Spaß, ich hoffe, das hat geholfen.
 
Hi und nachträglich Willkommen bei tutorials.de :)

Zuerst einmal: Wozu das
C++:
using namespace System;

Und
C++:
int main(array<System::Char ^> ^args)
greift auf .NET zu. Ist doch hier überflüssig.
C++:
int main()
reicht doch auch.

Zum datei.seekg: Statt am Anfang je nach Bedarf zu Dateianfang/-ende zu springen, kannst du das auch gleich beim Öffnen angeben.

Und zum eigentlichen Problem: Wenn du mit getline herausliest, bekommst du auch nur eine Zeile.
Das ist ganz normal. Mit einem weiteren getline würdest du die nächste Zeile bekommen...
Um die komplette Datei zu kopieren, würde ich zuerst die Dateigröße in Byte herausfinden (mit seekg und tellg) und dann mit read statt getline den ganzen Byteblock herauslesen.
Das ist zwar nicht ganz optimal (bei sehr großen Dateien alles auf einmal wird ein Problem), aber zum Lernen sollte es jetzt einmal reichen.
Wenn du das hast kannst du ja noch was machen, dass immer Blöcke von zB. 1024 Byte herausgelesen werden, dann die nächsten 1024 usw...Dann gehen beliebige Dateigrößen.

@üäpöol: FILE*-Funktionen und iostreams bieten ziemlich gleiche Möglichkeiten.
Nur anders verpackt.
Und dein Code liest doch auch nur eine Zeile...

Gruß
 
Zuletzt bearbeitet:
Hallo
Ich würde es auch so machen (macht man eigentlich nicht denn .eof() ist nicht die optimale lösung)
C++:
int main()
{
  string buffer; //Um immer eine Zeile auszulesen
  ifstream dat1;
  ofstream dat2;

  dat1.open("abc.txt");
  dat2.open("cba.txt"); //eventuell noch: dat2.open( "cba.txt", ios::app ); um text an dat2 anzuhängen glaub ich :D

  if( dat1.is_open() )
  {
     if( dat2.is_open() )
     {
       while( ! dat1.eof() )
       {
         getline( dat1, buffer );
         dat2<<buffer<<endl;
       }
      dat1.close();
      dat2.close();
    }
    else
    {
      //wen dat2 nicht geöffnet
    }
  }
  else
  {
    //wenn dat1 nicht geöffnet
  }

}
musst mal gucken obs stimt ich habe leider immoment kein compiler :D
Ich glaube aber das paar kleine rechtscreibfehler drin sind
MFG
 
Zuletzt bearbeitet von einem Moderator:
Man kann recht einfach auf eof verzichten und stattdessen die Rückgabe von getline() prüfen:
C++:
while( getline(dat1, buffer) )
{
    dat2 << buffer << endl;
}
Gruß
MCoder
 
  • Gefällt mir
Reaktionen: FSA
Hallo Leute, vielen Dank erstmal für eure schnellen und nützlichen Beiträge...ich hab mein problem jetzt folgendermaßen gelößt
// Programm 2.cpp: Hauptprojektdatei.

#include <stdafx.h>
#include <iostream> // wegen cout cin
#include <fstream> // wegen Dateistreamobjekt
#include <string> // wegen Datentyp string

using namespace std;

int main(int argc, char *argv)
{
ifstream file;
ofstream file2;

string fileName ;
string fileName2 ;

string text; // Haupttext

cin >> fileName ;

file.open(fileName.c_str()); // oeffen im Text-Modus
if(file)
{

while(!file.eof())
{
char buffer; // Buffer
file.get(buffer);
text += buffer; // Zeichen zusammensetzen
}
cout << text; // fertigen Text ausgeben
file.close();
}
else
{
cout << "Datei Fehler!";
}

cin.get();

fileName2 = "e:\\beispiel.txt";

file2.open(fileName2.c_str()); // oeffen im Text-Modus
if(file2)
{
file2 << text; // fertigen Text speichern

file2.close();
}
else
{
cout << "Datei Fehler!";
}
cin.get();
return 0;
}

Ich hab jetzt jedoch ein weiteres problem ich will die umlaute der test.txt in der beispiel.txt ersetzt kriegen jedoch muss dies mithilfe einer Steuerungs bzw crt datei geschehen, der Inhlat der Crt Datei ist folgendermaßen aufgebeaut:
# Steuerdatei fr uml.exe
#
# Wandlung von Windows nach ASCII
#
# 26.08.1997-AD

e4=84 # „ ae
f6=94 # ” oe
fc=81 # ue
c4=8e # Ž AE
d6=99 # ™ OE
dc=9a # š UE
df=e1 # á sz
a7=f5 # Paragraph

# End of File

so wie ich das sehe muss ich erst wieder die steuerdatei einlesen und zwar nur zeilen die nicht mit einer # beginnen, als nächstes würde ich dann versuchen den zeichenkode in ein array speichern und mit den die umlaute der test.txt ersetzen und verändert ausgeben
Leider haperst es schon beim auslesen der steuerdatei, der zeilen die nicht mit einer # beginnen ich hab es mit einer if schleife versucht jedoch weiß ich nicht wie ich dort den ascii code genau deklarieren kann,
wiegesagt programmiere seid knapp einer woche und hab für ein praktikum diese aufgabe gestellt bekommmen ich hoffe ihr könnt mir nochmal behilflich sein......
 
Hi

if ist keine Schleife. Schleifen sind while, for und do-while. Die wiederholen sich. if ist eine Bedingung.

Bzgl. "Windows zu ASCII": Codepage 850 zu ISO8859-1? :)D)

Zu dieser crt-Datei:
Alle Zeilen einlesen, bis die Datei zu Ende ist.
Mit jeder Zeile machst du folgendes:
1) Du suchst nach einem #. Wenn eines drinnen ist überschreibst du es mit \0 und schneidest somit den Rest, also den Kommentar, ab.
2) Überprüfst du, ob ein = vorkommt. Wenn nicht ist es keine gültige Zeile und macht nicht mit Punkt 3 weiter.
3) Mit
C++:
char vorne, hinten;
...
sscanf(string, "%x=%x", &vorne, &hinten);
holst du dir die hexadezimalen Werte da raus in zwei einzelne char.

Das Ganze wie gesagt mit jeder Zeile, und die char irgendwo zwischenspeichern.
Beim kopieren der Datei überprüfst du dann für jeden Byte, ob er einer der vorne-chars ist.
Wenn ja, schreibst du statt dem ursprünglichen Byte das dazupassende hinten-Byte in die neue Datei raus.

Gruß
 
Das was du oben beschrieben hast habe ich mit diesem Code versucht leider funktioniert er nicht und ich weiß nicht warum....
#include <iostream> // wegen cout cin
#include <fstream> // wegen Dateistreamobjekt
#include <string> // wegen Datentyp string
#include <algorithm>

using namespace std;

int main(int argc, char *argv)
{
ifstream file;

string fileName ;

string text ; // Haupttext

cin >> fileName ;

file.open(fileName.c_str()); // oeffen im Text-Modus
if(file)
{

while(!file.eof())
{
char buffer; // Buffer

int pos;

file.get(buffer);

text += buffer; // Zeichen zusammensetzen
}

int pos = text.find("#");

text.replace(pos,"/0");


cout << text; // fertigen Text ausgeben

file.close();
}
else
{
cout << "Datei Fehler!";
}

return 0;
}
könnte mir jemand nochmal helfen bitte....
 
1) Den Code bitte nicht als Zitat, sondern als Code posten
Statt quote cpp nehmen.

2) /0 ist was anderes als \0

3) Für dieses \0 und sscanf ist es nötig, von der string-Klasse weg zu den old-style char-Arrays zu gehen. Mit .c_str bekommst du das aus dem String raus.

4) hast du nicht alles umgesetzt, was ich dir oben geschrieben habe. Nur einen von drei Punkten.

5) Du liest da im Code nirgends zeilenweise aus.

6) Wenn was "Nicht funktioniert", bitte genauer werden.
Gibts Fehlermeldungen? Wie ist das erwartete Verhalten? Was tut das Programm stattdessen?
 
Zuletzt bearbeitet:
Zurück