-
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
// 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:
Ich hab auch noch ein Video gefunden, dass die eventuell weiterhilft:Code cpp:1 2 3 4 5 6 7 8 9 10 11
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 );
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
Code cpp:1
using namespace System;
Und
greift auf .NET zu. Ist doch hier überflüssig.Code cpp:1
int main(array<System::Char ^> ^args)
reicht doch auch.Code cpp:1
int main()
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ßGeändert von sheel (08.08.11 um 21:13 Uhr) Grund: Tippfehler ream->read
-
08.08.11 21:04 #4
Hallo
Ich würde es auch so machen (macht man eigentlich nicht denn .eof() ist nicht die optimale lösung)
musst mal gucken obs stimt ich habe leider immoment kein compilerCode cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
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 } }

Ich glaube aber das paar kleine rechtscreibfehler drin sind
MFGFehlermeldung bitte!
Google - Dein Freund und Helfer
-
Man kann recht einfach auf eof verzichten und stattdessen die Rückgabe von getline() prüfen:
GrußCode cpp:1 2 3 4
while( getline(dat1, buffer) ) { dat2 << buffer << endl; }
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
09.08.11 17:22 #6
Daran habe ich aber auch noch nicht gedacht

MFGFehlermeldung bitte!
Google - Dein Freund und Helfer
-
Hallo Leute, vielen Dank erstmal für eure schnellen und nützlichen Beiträge...ich hab mein problem jetzt folgendermaßen gelößt
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:// 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;
}
# 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? (
)
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
holst du dir die hexadezimalen Werte da raus in zwei einzelne char.Code cpp:1 2 3
char vorne, hinten; ... sscanf(string, "%x=%x", &vorne, &hinten);
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....
könnte mir jemand nochmal helfen bitte....#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;
}
-
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?Geändert von sheel (10.08.11 um 01:55 Uhr)
-
Hallo, ich wollte zuerst den Punkt 1) ausführen, da der mir schon sehr schwer fällt bevor ich mich an den Rest versuche. Ich habe nun auf meinen alten Code nochmal zurückgegriffen um die Datei zeilenweise einzulesen leider klappt das wieder nicht weil er zwar die Console startet aber nichts ausgibt, außerdem wo soll ich den dieses .c_str einbauen um den string wieder in chars umzuwandeln und wie baue ich den befehl sscanf ein.......hier nochmal mein Code der sich nur auf die crt Datei bezieht
ich weiß das ich ziemlich viel wissen will, ich würde mir auch die Referenzen selber durchlesen nur leider ist es so das ich unter zeitdruck stehe weil ich die aufgabe bis freitag den 12.08 fertig haben mussCode :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
// Projekt 4.cpp: Hauptprojektdatei. // Dateiinhalt lesen.cpp: Hauptprojektdatei. #include <stdafx.h> #include <fstream> #include <iostream> #include <string> using namespace std; using namespace System; int main(array<System::String^>^ argv) { ifstream datei ("e:\\win2dos.crt"); string inhalt; 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 while(!datei.eof()) { getline(datei,inhalt);} // inhalt der Datei auslesen bis die Datei am Ende ist (KA warum es nicht geht....) datei.close(); // die Datei schliessen cout << inhalt << endl; // Inhalt der 1 Textdatei ausgeben (gibt nichts aus) getchar(); return 0; }
-
Hallo,
So ist der Test richtig:
Code cpp:1 2 3 4
if( !datei.is_open() ) // wenn er die Datei nicht findet..... { // ... }
Den Aufruf von seekg() kanst du dir sparen. Nach dem Öffnen der Datei steht Dateizeiger immer an der ersten Stelle.
getline() funktioniert schon richtig. Allerdings wird (wie der Name schon sagt) immer nur eine Zeile gelesen und am Ende der Datei gar nichts. Daher ist die Ausgabe leer. Außerdem sollte man eof() vermeiden.
So sollte es funktionieren:
GrußCode cpp:1 2 3 4 5 6
string inhalt, zeile; while( getline(datei, zeile) ) { inhalt += ( zeile + string("\n") ); }
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
Also, dann könntest du dir wenigstens durchlesen, was wir hier schreiben. Durchlesen, nicht Code kopieren.
Wer hat dir diesen Sch... von Mainparameter beigebracht?
Wenn du C oder C++ programmieren willst, ist das einfach falsch.
Was du im gezeigten Code alles falsch hast wurde dir alles schonmal gesagt.
Ich werde jetzt den Code ausbessern, einmal.
Erklärungen dazu bitte in den älteren Beiträgen lesen. Keine Lust, alles doppelt zu schreiben.
Das gibt den Dateiinhalt aus.Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
#include <fstream> #include <iostream> #include <string> using namespace std; int main() { ifstream datei; string inhalt; datei.open("e:\\cp850_to_iso8859-1.crt"); if(!datei) { cout << "Datei wurde nicht gefunden" << endl; getchar (); return -1; } while(getline(datei, inhalt)) { cout << inhalt << endl; } datei.close(); getchar(); return 0; }
GrußGeändert von sheel (12.08.11 um 01:20 Uhr) Grund: doer->oder
-
Verzeih bitte ich habe die älteren Beiträge gelesen und leider nicht alles verstanden die Mainparameter werden von Visual C++ so vorgegeben wenn man ein neues Projekt öffnet daher dachte ich es wäre sinnvoll Sie stehen zu lassen, tut mir nochmal Leid ich wollte niemanden verärgern.
Nochmal zu Punkt 1) ich hab versucht den crt jetzt wie folgt einzubauen:
jedoch bekomm ich die Kompiler meldung das strcpy_s keine 2 Argumente akzeptiert...ich hab beim googeln jetzt leider keine bessere Methode mithilfe con .c_str gefunden den String in ein Char Array umzuwandeln....verzeiht bitte meine Unwissenheit....Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
// Programm 2.cpp: Hauptprojektdatei. #include <stdafx.h> #include <fstream> #include <iostream> #include <string> using namespace std; int main() { ifstream datei; string line; string inhalt; datei.open("e:\\win2dos.crt"); if(!datei) { cout << "Datei wurde nicht gefunden" << endl; getchar (); return -1; } while(getline(datei, line)) { char* zeichen = new char[line.size() + 1]; strcpy_s(zeichen, line.c_str()); // Kompiler empfiehlt strcpy_s zu verwenden zeichen = new char[line.size() + 1]; delete[] zeichen; // zeichen wieder freigeben inhalt += (line); cout << line << endl; } datei.close(); getchar(); return 0; }
-
Dann frag doch einfach nach

Verwendest du die 2010-Version?
Welches Projekt erstellst du?
Was stellst du beim Projekt genau ein?
Tatsache ist, das du mit diesem Zeug weg von C oder C++ zu .NET gehst.
Wenn du die Konsolenparameter sowieso nicht brauchst, kannst du die () Klammern auch einfach leer lassen. Andernfalls gibt es noch immer eine reine C-Lösung.
Kein Problem.
Mir tut es leid, falls ich unfreundlich rüber gekommen bin.
War nicht böse gemeint
Zum Code: Der ist schon ziemlich richtig.
Man kann einige Sachen eventuell "schöner" lösen (wie wichtig ist das eurem Lehrer?), aber zumindest ist nichts falsch. Sogar das delete hast du nicht vergessen
, passiert den meisten Anfängern.
Zu dem einen Compilerfehler: Wenn er nach strcpy_s schreit, mach ihm den Gefallen.
Die neueren Microsoftcompiler sind da alle ganz scharf drauf...
strcpy_s will aber im Gegensatz zum normalen strcpy noch die Stringlänge.
Einfach das
mi dem austauschen:Code cpp:1
strcpy_s(zeichen, line.c_str());
Code cpp:1
strcpy_s(zeichen, line.size() + 1, line.c_str());
Noch was: Das
brauchst du nicht mehr, oder?Code cpp:1
inhalt += (line);
Gruß
PS: Ui, heute Abgabe...häng dich rein, das schaffst du noch!
Ich bin auch noch länger munter, falls du noch Hilfe brauchst
Geändert von sheel (12.08.11 um 01:43 Uhr)
Ähnliche Themen
-
auslesen einer textdatei und in eine neue textdatei schreiben
Von prinzessin4444 im Forum C/C++Antworten: 3Letzter Beitrag: 10.12.08, 12:01 -
Inhalt einer Textdatei sortieren
Von d4kine im Forum .NET DatenverwaltungAntworten: 3Letzter Beitrag: 07.01.07, 23:49 -
Inhalt (nicht Quelltext) einer HTML Seite als textdatei speichern
Von MatMagic im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 17.05.05, 10:52 -
Mit Inhalt einer Textdatei Rechnen ?
Von Corefice im Forum Visual Basic 6.0Antworten: 1Letzter Beitrag: 22.01.05, 22:09 -
Inhalt einer Textdatei löschen?
Von michischmuki im Forum PHPAntworten: 3Letzter Beitrag: 30.04.04, 01:47



2Danke

Zitieren



Login






