char und int problem



  • Hi!

    Also erstmal würde ich die Dateiströme aus C++ verwenden. Desweiteren würde ich das zu suchende Zeichen und das zu ersetzende Zeichen als 2 Konstanten vom Typ char definieren. Dazu solltest du den Typ string verwenden und die Datei in einen Puffer laden, darin die Zeichen ersetzen und dann den gesamten Puffer wieder wegschreiben.
    Außerdem hast du da feof stehen was auf die neue Datei angewandt wird. Das kann ja nicht funktionieren. Desweiteren dauert es wesentlich länger eine Datei immer wieder nach jeder Änderung zu schreiben, als einmal zu laden, Daten ändern und dann wieder speichern (wenn die Datei zu groß ist kann man sowas auch blockweise erledigen).
    Ich würde es also etwa so machen:

    const char gesucht='a';
    const char ersatz='9';
    std::string puffer("");
    
    {
      std::ifstream alteDatei("alteDatei.txt");
      while(!alteDatei.eof()) {
        std::string tmp("");
        std::getline(alteDatei, tmp);
        puffer+=tmp+'\n';
      }
    }
    
    std::size_t len = puffer.length();
    for(std::size_t i=0; i<len; ++i) {
      if(puffer[i] == gesucht)
        puffer[i] = ersatz;
    }
    
    {
      std::ofstream neueDatei("neueDatei.txt");
      neueDatei << puffer;
    }
    

    Code-Hacker



  • EarlyBird schrieb:

    Hallo,

    naja, um ein wenig Schreibarbeit wirst Du wohl nicht herumkommen... 😋

    Aber, ich würde es öber ein Mapping des Zeichensatzes machen.

    static const char AsciiMap[] =
    {
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }; // 255 Werte für kodierte Zeichen
    
    // in Deiner while-Schleife
    while ( !feof( datei_new ) )
    {
        fprintf( datei_new, AsciiMap[ puffer[i] ] );
        i++;
    }
    

    Die Map muss natürlich mit sinnvollen Werten gefüllt werden, wozu ich nun
    gerade keine Lusr gehabt habe... 🙂

    Gruss
    EarlyBird

    schreibe ich dann quasi in die AsciiMap die codierten werte hinein?!



  • Code-Hacker schrieb:

    Hi!

    Also erstmal würde ich die Dateiströme aus C++ verwenden. Desweiteren würde ich das zu suchende Zeichen und das zu ersetzende Zeichen als 2 Konstanten vom Typ char definieren. Dazu solltest du den Typ string verwenden und die Datei in einen Puffer laden, darin die Zeichen ersetzen und dann den gesamten Puffer wieder wegschreiben.
    Außerdem hast du da feof stehen was auf die neue Datei angewandt wird. Das kann ja nicht funktionieren. Desweiteren dauert es wesentlich länger eine Datei immer wieder nach jeder Änderung zu schreiben, als einmal zu laden, Daten ändern und dann wieder speichern (wenn die Datei zu groß ist kann man sowas auch blockweise erledigen).
    Ich würde es also etwa so machen:

    const char gesucht='a';
    const char ersatz='9';
    std::string puffer("");
    
    {
      std::ifstream alteDatei("alteDatei.txt");
      while(!alteDatei.eof()) {
        std::string tmp("");
        std::getline(alteDatei, tmp);
        puffer+=tmp+'\n';
      }
    }
    
    std::size_t len = puffer.length();
    for(std::size_t i=0; i<len; ++i) {
      if(puffer[i] == gesucht)
        puffer[i] = ersatz;
    }
    
    {
      std::ofstream neueDatei("neueDatei.txt");
      neueDatei << puffer;
    }
    

    Code-Hacker

    hm also ich habe das hier ausprobiert, allerdings findet er std nicht. er meint string ist ein nicht deklarierter bezeichner und std ist keine klasse....

    ich habe da auch schon #include <string.h> vorgenommen, aber er will dennoch nicht!



  • 1.: Die neuen header der stl haben keine Endung. Es heißt also #include <string>. @codehacker: Kennst du die Probleme die eine Schleife ala while(!file.eof()) birgt? Also: diese Schleife ist
    -unsicher
    -nicht effizient
    Wie es richtig sein müsste fällt mir aber auch grad net ein. Ich glaube du musst noch das fail-Bit testen. Ich glaube Hume* (Ich kann mir den name nicht merken) hat da was auf seiner Seite.



  • #include <string>

    using std::string;



  • Vlad schrieb:

    schreibe ich dann quasi in die AsciiMap die codierten werte hinein?!

    Ja, ich muß jedoch zugeben, das ich mir Deine Schleife nicht so genau angesehen
    habe... Im Prinzip nimmst du jedes Byte aus der Source-Datei, mapst es gegen
    die AsciiMap und schreibst das gemappte Byte in die Zieldatei.

    Eine Kombination aus Codehackers Code und der Map sollte das Ergebnis liefern.

    Gruss
    EarlyBird



  • jap danke für eure hilfe. mein code sieht nun so aus:

    #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    #include <string>
    using std::string;
    
    int main()	
    {
    	const char gesucht = 'a';
    	const char ersatz = '9';
    
    	std::string puffer("");
    	{
    		std::ifstream alteDatei("to_crypt.txt");
    		while(!alteDatei.eof()) 
    		{
    			std::string tmp("");
    			std::getline(alteDatei, tmp);
    			puffer+=tmp+'\n';
    		}
    	}
    
    	std::size_t len = puffer.length();
    
    	for(std::size_t i=0; i<len; ++i) 
    	{
    		if(puffer[i] == gesucht)
    		    puffer[i] = ersatz;
    	}
    
    	std::ofstream neueDatei("crypted.txt");
    	neueDatei << puffer;
    
    	return 0;
    }
    

    ich erhalte schon bei std:ifstream.... folgenden fehler....

    'alteDatei' verwendet undefiniertes class 'basic_ifstream<char,struct std::char_traits<char> >'

    ich kenne mich mit string nicht wirklich so aus. deshalb habe ich keine ahnung was das hier sein könnte...



  • Du brauchst ein

    #include <fstream>
    

    Sonst kennt er die File-Stream-Klassen nicht....

    Achja und mit einem

    using namespace std;
    

    kannst du dir die ganzen "std::"s sparen. Dein using std::string; ergbit keinen Sinn, wenn du eh immer std::string schreibst...

    Mfg, smasher1985



  • danke für den tipp... allerdings muss er ja immernoch meckern

    std::size_t len = puffer.length();
    

    size_t ist angeblich kein element von std.... *verzweifel*



  • Hallo,

    hier mal mein Vorschlag:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    static const char CodePage[] =
    {
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x0A, 0x2D, 0x2D, 0x0D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
    	0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D
    }; // 255 Werte für kodierte Zeichen
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	ifstream src(".\\ReadMe.txt", ios::in | ios::ate );
    	ofstream dst(".\\eMdaeR.txt", ios::out );
    	if ( src.is_open() && dst.is_open() )
    	{
    		unsigned char buffer[1024];
    
    		size_t fileSize = src.tellg();
    		src.seekg(0, ios::beg);
    		fileSize -= src.tellg();
    
    		while ( fileSize > 0 )
    		{
    			size_t count = min( sizeof(buffer) / sizeof(buffer[0]), fileSize );
    			src.read( reinterpret_cast<char*>(buffer), static_cast<streamsize>(count) );
    			for ( size_t i = 0; i < count; ++i )
    				buffer[i] = CodePage[buffer[i]];
    			dst.write( reinterpret_cast<char*>(buffer), static_cast<streamsize>(count) );
    			fileSize -= count;
    		}
    
    		src.close();
    		dst.close();
    	}
    
    	return 0;
    }
    

    Der Code wandelt die Datei ReadMe.txt aus dem VC-Projektverzeichnis um.
    Die Zieldatei enthält anstatt der Originalzeichen das minus-Zeichen.

    Gruss
    EarlyBird



  • Hi!

    Vlad schrieb:

    jap danke für eure hilfe. mein code sieht nun so aus:

    #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    #include <string>
    using std::string;
    
    int main()	
    {
      [...]
    
    	{
    	  std::ofstream neueDatei("crypted.txt");
    	  neueDatei << puffer;
    	}
    
    	return 0;
    }
    

    Dateiobjekte soll man nicht lange geöffnet haben deswegen habe ich dort wo ich Dateien verwende einen Block rum gemacht. Beim ersten Block zum lesen hast du die Blockklammerung gelassen, diese sollte aber auch beim zweiten sein. Damit verkürzt du die Lebenszeit des Dateiobjekts.

    @ness:
    Jo, stimmt, man kann sicher noch Lesefehler überprüfen und die Streamgültigkeit, aber das muss der Threadersteller selbst machen. Habe mal eben auf HumeSikkins-Seite in der FAQ geguckt, kannte diesen Artikel noch nicht, aber du meinst sicher diesen:
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=eof#Answ

    Code-Hacker


Anmelden zum Antworten