tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
23
ZUGRIFFE
1239
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    CaS CaS ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    9
    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;
    }
     

  2. #2
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    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:
    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 );
    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.
     

  3. #3
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi und nachträglich Willkommen bei tutorials.de

    Zuerst einmal: Wozu das
    Code cpp:
    1
    
    using namespace System;

    Und
    Code cpp:
    1
    
    int main(array<System::Char ^> ^args)
    greift auf .NET zu. Ist doch hier überflüssig.
    Code cpp:
    1
    
    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ß
    Geändert von sheel (08.08.11 um 21:13 Uhr) Grund: Tippfehler ream->read
     

  4. #4
    Avatar von MSVCplusplus
    MSVCplusplus MSVCplusplus ist offline Mitglied Brokat
    Registriert seit
    Dec 2010
    Ort
    Hessen
    Beiträge
    336
    Hallo
    Ich würde es auch so machen (macht man eigentlich nicht denn .eof() ist nicht die optimale lösung)
    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
    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
      }
     
    }
    musst mal gucken obs stimt ich habe leider immoment kein compiler
    Ich glaube aber das paar kleine rechtscreibfehler drin sind
    MFG
     
    Fehlermeldung bitte!
    Google - Dein Freund und Helfer

  5. #5
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Man kann recht einfach auf eof verzichten und stattdessen die Rückgabe von getline() prüfen:
    Code cpp:
    1
    2
    3
    4
    
    while( getline(dat1, buffer) )
    {
        dat2 << buffer << endl;
    }
    Gruß
    MCoder
    MSVCplusplus bedankt sich. 
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  6. #6
    Avatar von MSVCplusplus
    MSVCplusplus MSVCplusplus ist offline Mitglied Brokat
    Registriert seit
    Dec 2010
    Ort
    Hessen
    Beiträge
    336
    Daran habe ich aber auch noch nicht gedacht
    MFG
     
    Fehlermeldung bitte!
    Google - Dein Freund und Helfer

  7. #7
    CaS CaS ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    9
    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......
     

  8. #8
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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
    Code cpp:
    1
    2
    3
    
    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ß
     

  9. #9
    CaS CaS ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    9
    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....
     

  10. #10
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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)
     

  11. #11
    CaS CaS ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    9
    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 :
    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;
    }
    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
     

  12. #12
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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:
    Code cpp:
    1
    2
    3
    4
    5
    6
    
    string inhalt, zeile;
     
    while( getline(datei, zeile) )
    {
        inhalt += ( zeile + string("\n") );
    }
    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  13. #13
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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.

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

    Gruß
    Geändert von sheel (12.08.11 um 01:20 Uhr) Grund: doer->oder
     

  14. #14
    CaS CaS ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    9
    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 :
    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;
    }
    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....
     

  15. #15
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Zitat Zitat von CaS Beitrag anzeigen
    Verzeih bitte ich habe die älteren Beiträge gelesen und leider nicht alles verstanden
    Dann frag doch einfach nach

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

    Zitat Zitat von CaS Beitrag anzeigen
    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
    Code cpp:
    1
    
    strcpy_s(zeichen, line.c_str());
    mi dem austauschen:
    Code cpp:
    1
    
    strcpy_s(zeichen, line.size() + 1, line.c_str());

    Noch was: Das
    Code cpp:
    1
    
    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
    Geändert von sheel (12.08.11 um 01:43 Uhr)
     

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 10.12.08, 12:01
  2. Inhalt einer Textdatei sortieren
    Von d4kine im Forum .NET Datenverwaltung
    Antworten: 3
    Letzter Beitrag: 07.01.07, 23:49
  3. Antworten: 2
    Letzter Beitrag: 17.05.05, 10:52
  4. Mit Inhalt einer Textdatei Rechnen ?
    Von Corefice im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 22.01.05, 22:09
  5. Inhalt einer Textdatei löschen?
    Von michischmuki im Forum PHP
    Antworten: 3
    Letzter Beitrag: 30.04.04, 01:47