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

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
Code:
// 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;
}
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 muss
 
Hallo,

So ist der Test richtig:
C++:
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:
C++:
string inhalt, zeile;

while( getline(datei, zeile) )
{
    inhalt += ( zeile + string("\n") );
}
Gruß
MCoder
 
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.

C++:
#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;
}
Das gibt den Dateiinhalt aus.

Gruß
 
Zuletzt bearbeitet:
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:
Code:
// 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;
}
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....
 
Verzeih bitte ich habe die älteren Beiträge gelesen und leider nicht alles verstanden
Dann frag doch einfach nach :eek:

die Mainparameter werden von Visual C++ so vorgegeben wenn man ein neues Projekt öffnet
:suspekt: 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.

tut mir nochmal Leid ich wollte niemanden verärgern.
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
C++:
strcpy_s(zeichen, line.c_str());
mi dem austauschen:
C++:
strcpy_s(zeichen, line.size() + 1, line.c_str());

Noch was: Das
C++:
inhalt += (line);
brauchst du nicht mehr, oder?

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 :)
 
Zuletzt bearbeitet:
Hi.
Zu dem einen Compilerfehler: Wenn er nach strcpy_s schreit, mach ihm den Gefallen.
Erstmal ist es kein Fehler, sondern nur eine Warnung. Die kann man einfach ignorieren; vor allem da strcpy_s keine Standard C/C++ Funktion ist. Dazu einfach in den Projekteinstellungen folgende Präprozessorvariablen definieren:
Code:
_SCL_SECURE_NO_WARNINGS 
_SCL_SECURE_NO_DEPRECATE
_CRT_SECURE_NO_WARNINGS 
_CRT_SECURE_NO_DEPRECATE
strcpy_s will aber im Gegensatz zum normalen strcpy noch die Stringlänge.
Einfach das
C++:
strcpy_s(zeichen, line.c_str());
mi dem austauschen:
C++:
strcpy_s(zeichen, line.size() + 1, line.c_str());
Das dient übrigens dazu Speicherzugriffsfehler zu vermeiden, da die Funktion die mit dem 2. Parameter auch die Größe des Zielstrings kennt. Trotzdem ist der Nutzen der Funktion zweifelhaft, da man als 2 Parameter schließlich irgendwas übergeben kann, und somit eben immer noch selbst dafür verantwortlich die richtige Größe zu überprüfen/ermitteln.

Gruß
 
hallo, ich war jetzte leider zwei wochen weg und hab etwas den faden verloren ich hab jetzte versucht auf diese weise die zeichen zu ersetzen...
C++:
// Programm 2.cpp: Hauptprojektdatei.

#include <stdafx.h>
#include <fstream>
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    ifstream datei;
	string line;
    string inhalt;
	int pos;
	
 
    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.size() + 1, line.c_str()); // Kompiler empfiehlt strcpy_s zu verwenden

	zeichen = new char[line.size() + 1];

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

	zeichen.replace(pos,"/0");
 
	delete[] zeichen; // zeichen wieder freigeben

	cout << line << endl;
    }
 
    datei.close();
    getchar();
    return 0;
}
leider funktioniert das nicht...muss ich dann nochmal jetzt nohmal die chars auslesen oder....
 
Hi

hättest du nicht vor drei Wochen schon abgeben sollen? :rolleyes:
Naja...was solls...

Schau dir einmal den ersten Link und die drittte Zeile meiner Signatur an.

Zum Code: Alles außer dem Inhalt der while-Schleife schaut korrekt aus.

Das Innere der Schleife ist aber ein Desaster.
1) Was genau soll das ersetzen? Da seh ich nicht, dass irgendwas ersetzt wird.
2) Darf das nicht kompilieren. Ein char-Pointer hat keine Klassenmethoden.
3) Reservierst du zweimal Speicher, wobei du nur einmal wieder freigibst.
4) Wozu überhaupt zeichen reservieren, wenn du schon line hast?
5) Suchst du ein # in einem String, der keinen Inhalt hat.
Gute Quelle für unerklärliche Fehler und Abstürze.
6) hab ich schon vor langer, langer Zeit geschrieben, dass /0 nicht \0 ist.

Da gibts auch noch einige andere Sachen, die schon gesagt wurden.
Wenn du "den Faden verloren" hast lies dir das Thema von Anfang an nocheinmal durch. Hab ich vor diesem Beitrag auch gemacht.
Und irgendwie hatte ich den Eindruck, dass du vom Verständis her schon mal weiter warst als jetzt...
 
Zuletzt bearbeitet:
also bis zur while schleife versteh ich auch noch was das programm tut soweit ich mich erinner kann wandeln die nächsten drei befehle den string line(also den string in dem der Text der Datei gespeichert wurde) in ein char Array um und ich dachte das das char array in diesem falle "zeichen" ist und dann wollte ich mithilfe der variable pos das zeichen "#" aus dem array finden und erstzen, so hab ich mir das vorgestellt.....sollt ich jetzte nach den drei befehlen nochmal ne schleife einbauen oder....und mit thread
war noch der befehl sscan wie ich den einstzen soll......
.....verzeih bitte wenn ich zu krass damit nerve....
 
.....verzeih bitte wenn ich zu krass damit nerve....
Es wäre einfach einmal schön, wenn du dich an die hier gültigen Regeln hälst.
Wenn man das Forum dauerhaft nützen will sollte man sich daran halten.

Ich komm hier übrigens jeden Tag mit Anfängern in Kontakt;
würde ich das machen wenn mich das Anfänger-sein nervt?
Was nervt: Wenn man umsonst schreibt, weil der Anfänger nicht liest.
Und wenn der Anfänger einen anlügt, damit ihm schneller geholfen wird.
Nach 2500 Beiträgen kann man sowas schnell durchschauen,
es sind nämlich immer die selben Aussagen.

soweit ich mich erinner kann wandeln die nächsten drei befehle den string line(also den string in dem der Text der Datei gespeichert wurde) in ein char Array um und ich dachte das das char array in diesem falle "zeichen" ist
Ja, die ersten zwei Befehle machen das.
Aber erstens brauchst du das gar nicht, kannst es also weglassen,
und zweitens wird das ganze mit dem dritten Befehl wieder vernichtet.
Der besorgt sich eine neue Stange Bytes und schmeißt die anderen mit den Buchstaben drin einfach weg. Für diese wäre ein delete übrigens auch gut.

dann wollte ich mithilfe der variable pos das zeichen "#" aus dem array finden und erstzen, so hab ich mir das vorgestellt.....
Aber wie kommst du auf die Idee, dass jede Variable irgendwelche Funktionen eingebaut hat?
Kannst du beinem int i schreiben "i.wurzel"? Nein.

sollt ich jetzte nach den drei befehlen nochmal ne schleife einbauen oder....
Kommt darauf an, ob du noch was ersetzen willst...

und mit thread war noch der befehl sscan wie ich den einstzen soll......
sscanf zufällig? Steht alles schon hier.
Und wozu willst du einen Thread?
 
Zurück