Anzeige:
Ergebnis 1 bis 11 von 11

Thema: Text 'verschlüsseln'

  1. #1
    Registrierter Benutzer
    Registriert seit
    15.09.2006
    Beiträge
    22

    Text 'verschlüsseln'

    Hi,

    ich möchte euch heute mit einem Einsteiger Programm nerven,wo sich manche die Augen rollen werden.Aber ich bin leider in der Lage das ich für die Schule eine Aufgabe zu erledigen habe(keine Sorge,ich will nicht das mir einer das Stück für Stück vorkaut),an derer ich bisher scheitere.

    Die Aufgabenstellung lautet:

    Schreiben Sie ein Programm das ein Textfile einliest,und dessen Inhalt um einen ASCII Code erhöht.
    Hier mein bisheriger Stand:
    Code:
    #include<iostream>
    using namespace std;
    int main()   //Parameter später ergänzen
    {
    	FILE *datei;  //dateizeiger
    	datei=fopen("/home/bernhard/schule/C++/test.txt","r");   //Textdatei "laden"
    	char string[800];
    	int a,b,c,d; //Hilfsvariablen
    	while(fgets(string,80,datei))  //zeilenweises ausgeben am Bildschirm
    	{
    		puts(string);
    	}
    	a=strlen(string);  //schauen wie lang der String ist
    	fseek(datei,0,0); //Dateizeiger an den Anfang setzen
    	for(b=0;b<=a;b++)
    	{
    		c=(char)string[b];  //Umwandlung nach char
    		c+=1;   //Erhöhung des Wertes um 1
    		fseek(datei,1,1);
    	}
    	d=(int)c;
    	cout<<d<<endl;
    }
    Ich habe so das dumpfe Gefühl das an dem Quellcode ziemlich viel falsch sein wird(sowohl von der Denkweise als auch von der Ausprogrammierung),nur komme ich beim besten Willen nicht darauf was es sein könnte.

    Am ehesten würde ich Fehler in der Konvertierung zu char vermuten,laut meinen Recherchen bei Google sollte es aber funktionieren.

    Vielen Dank!

    mfg klicke

  2. #2
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    Wenn ihr mit C++ arbeitet, dann bietet sich auch die C++ Dateiarbeit mit Streams an, was Du machst, ist C-Dateiarbeit.
    Du sparst Dir dann die ganzen seeks, strlen usw. und kannst die string-Klasse von C++ benutzen.
    Du kannst die Datei zeilenweise einlesen und dabei dann jedes Zeichen der Zeile wie gewünscht modifizieren (müsst ihr um ein Zeichen verschieben?)
    Insgesamt gehts aber in die richtige Richtung, behaupte ich mal ohne es ganz genau untersucht zu haben
    I haven't lost my mind - It's somewhere on a backup-disc

  3. #3
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    C (nicht C++):
    Code:
    #include <stdio.h>
    
    int main() {
       int c = EOF;
       while( (c = fgetc( stdin )) != EOF ) {
          fputc( c+1, stdout );
       }
       return 0;
    }
    Das hier liest von stdin Zeichenweise ein und gibt auf stdout alle Zeichen um 1 erhöht aus. Der grenzfall 255 ist hier nciht beachtet. Also wenn das Zeichen mit dem Wert 255 kommt, wird das womöglich nen blödsinn liefern. Wie auch immer, in der Angabe steht net definiert was da passieren soll. Soll dann 0 kommen?
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  4. #4
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Zitat:
    Schreiben Sie ein Programm das ein Textfile einliest,und dessen Inhalt um einen ASCII Code erhöht.
    Die Frage ist ziemlich mehrdeutig. Da es sich um eine Textdatei handelt, was ist der Inhalt? Die Folge von Zeichen die auf der Platte gespeichert sind? Oder nur der Text selber, also das zum Beispiel das Zeilenende nicht signifikant ist? Und sollen die Änderungen eigentlich zurückgeschrieben werden? Außerdem gibt die Formulierung "um einen ASCII Code" keinen Sinn, auch wenn man wohl raten kann das man 1 addieren soll.

    Code:
    fseek(datei,1,1);
    Das ist unportabel, weil du erstens nicht weißt ob die 1 an der letzen Stelle tatsächlich SEEK_CUR bedeutet, und zweitens wird für Textdateien nur garantiert das fseek mit einer 0 an der zweiten Stelle umgehen kann, oder mit einem Wert der von einem früheren Aufruf von "ftell" stammt.

    Stylistisch würde ich dir dazu raten Variablen erst dann zu definieren wenn sie gebraucht werden (also nicht int a, b, c ,d; in einer Reihe), und überflüssige Casts zu entfernen.

  5. #5
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von locus vivendi Beitrag anzeigen
    Stylistisch würde ich dir dazu raten Variablen erst dann zu definieren wenn sie gebraucht werden (also nicht int a, b, c ,d; in einer Reihe),
    und den Variablen auch aussagekräftige Namen geben.

    Wie z.B. laenge statt a.

  6. #6
    Registrierter Benutzer
    Registriert seit
    15.09.2006
    Beiträge
    22
    Mittlerweile habe ich das Problem durch einen Zufall heute Morgen gelöst.
    Meine Lösung geht in eine andere Richtung,ist aber auch ziemlich unschön.

    @SeeksTheMoon: Das was wir in der Schule lernen ist ein gemischtes Zeug,manche Sachen lernen wir in C++ andere wiederrum in C.
    Was zu enormer Verwirrung führt und leider keinerlei praktischen Nutzen hat.

    @panzi: Ich hatte deinen Vorschlag probiert,doch bei mir kamen da zig Fehlermeldungen raus.

    @locus vivendi:

    Stylistisch würde ich dir dazu raten Variablen erst dann zu definieren wenn sie gebraucht werden (also nicht int a, b, c ,d; in einer Reihe), und überflüssige Casts zu entfernen.
    Das definieren einer Variable im Vorhinein habe ich mir irgendwann mal angewöhnt und von dem werde ich wohl nicht mehr wegkommen.
    Was sind eigentlich 'Casts'?

    @Joghurt: Ebenfalls eine schlechte Angewöhnung meinerseits,in den Prototypen eines Programmes verwende ich meistens nur irgendwelche Buchstaben,da ich meistens ohne eine Idee darauflos programmiere und viele verschiedene Sachen ausprobiere.
    In der endgültigen Version wird das dann ein bisschen übersichtlicher.
    Ist zwar die doppelte Arbeit aber die Programme sind derzeit eh noch nicht sehr lang.

    Alles in allem möchte ich mich für eure Lösungsvorschläge bedanken!

    mfg klicke

  7. #7
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von klicke Beitrag anzeigen
    @locus vivendi:

    Das definieren einer Variable im Vorhinein habe ich mir irgendwann mal angewöhnt und von dem werde ich wohl nicht mehr wegkommen.
    Musst du in C auch so machen - ist meiner Meinung nach auch für global verwendete Variablen durchaus richtig (bei C++, Java,... - dann hast du einen Block in welchem du siehst, welche Variablen alle gebraucht werden). Temporäre Variablen sollten allerdings so "weit" im Programm wie möglich definiert werden, da sie so nur für den lokalen Skope gültig sind und du viele komische Fehler verhindern kannst, weil gerade noch eine Variable von früher her gesetzt ist.

    Was sind eigentlich 'Casts'?
    Typecast - beispielsweise, wenn du aus einem int einen double machst; Oder eben aus einem char einen int.

    @Joghurt: Ebenfalls eine schlechte Angewöhnung meinerseits,in den Prototypen eines Programmes verwende ich meistens nur irgendwelche Buchstaben,da ich meistens ohne eine Idee darauflos programmiere und viele verschiedene Sachen ausprobiere.
    In der endgültigen Version wird das dann ein bisschen übersichtlicher.
    Ist zwar die doppelte Arbeit aber die Programme sind derzeit eh noch nicht sehr lang.
    Gewöhn dir das _SOFORT_ wieder ab, weil:
    - Unleserlicher Code (wenn du ihn später anschaust / jemandem anders gibst)
    - Sehr fehleranfällig (ich glaub es war a - vielleicht wars aber auch b...)
    - Schwer zu verifizieren, ob der Code auch das macht, was er soll, wenn du die Variablen nicht sinnvoll benennst und gut kommentierst.

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  8. #8
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Zitat Zitat von klicke Beitrag anzeigen
    @panzi: Ich hatte deinen Vorschlag probiert,doch bei mir kamen da zig Fehlermeldungen raus.
    Was geht da nicht? Bei mir kompeliert das mit -Wall -ansi -pedantic. Poste mal die Fehlermeldung.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  9. #9
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von klicke Beitrag anzeigen
    Ebenfalls eine schlechte Angewöhnung meinerseits,in den Prototypen eines Programmes verwende ich meistens nur irgendwelche Buchstaben,da ich meistens ohne eine Idee darauflos programmiere und viele verschiedene Sachen ausprobiere.
    Und genau das ist falsch.

    OK, um sich in eine Sprache einzuarbeiten, mag es noch ok sein, aber programmieren besteht zum Großteil aus Planung. Überlege erst, wie du das Problem lösen kannst, und programmiere dann.

    Ein Architekt läßt auch nicht einfach drauf los bauen, und schaut mal nach, was sich so ergibt. Er denkt erst nach, das eigentliche zusammenzimmern ist dann nur noch reine Formsache.

    Wenn du also beim Programmieren einer Variable noch keinen Namen geben kannst, weil du noch nicht so richtig weisst, wofür du sie brauchst, machst du etwas falsch!
    Glaube mir, aus uns spricht die Erfahrung! Du machst dir unnötig viel arbeit, wenn du einfach so drauf los programmierst.

  10. #10
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Das was wir in der Schule lernen ist ein gemischtes Zeug,manche Sachen lernen wir in C++ andere wiederrum in C.
    Was zu enormer Verwirrung führt und leider keinerlei praktischen Nutzen hat.
    Wenn du deinen Untericht mit anderen Quellen abgleichen willst, kannst du hier mal reinschauen: http://www.icce.rug.nl/documents/cpp.shtml

    Die folgenden Links führen zu besonders für Einsteiger nützlichen Informationen. Das letzte Dokument in der Liste ist nicht mehr ganz aktuell, aber um auf gewisse potentielle Probleme aufmerksam zu machen immer noch gut.
    http://www.parashift.com/c++-faq-lite/
    http://www.research.att.com/~bs/homepage.html
    http://www.horstmann.com/cpp/pitfalls.html

  11. #11
    Registrierter Benutzer
    Registriert seit
    15.09.2006
    Beiträge
    22
    Zitat Zitat von bischi Beitrag anzeigen
    Musst du in C auch so machen - ist meiner Meinung nach auch für global verwendete Variablen durchaus richtig (bei C++, Java,... - dann hast du einen Block in welchem du siehst, welche Variablen alle gebraucht werden). Temporäre Variablen sollten allerdings so "weit" im Programm wie möglich definiert werden, da sie so nur für den lokalen Skope gültig sind und du viele komische Fehler verhindern kannst, weil gerade noch eine Variable von früher her gesetzt ist.
    Ok,du hast mich überzeugt,ich versuche mir das nun so anzugewöhnen

    Typecast - beispielsweise, wenn du aus einem int einen double machst; Oder eben aus einem char einen int.
    So nennt man das also in der Fachsprache.
    Gewöhn dir das _SOFORT_ wieder ab, weil:
    - Unleserlicher Code (wenn du ihn später anschaust / jemandem anders gibst)
    - Sehr fehleranfällig (ich glaub es war a - vielleicht wars aber auch b...)
    - Schwer zu verifizieren, ob der Code auch das macht, was er soll, wenn du die Variablen nicht sinnvoll benennst und gut kommentierst.
    Nachdem ich nun heute wieder am Programm gearbeitet habe und feststellen musste das die Variablen teilweise echt blöd sind,sehe ich es ein das es sinnvoll ist sie gleich richtig zu benennen.

    @panzi: Hab gerade eben noch mal nachgesehen,jetzt funktioniert es komischerweise..

    @Joghurt: Es ist leider so,dass ich noch nicht sonderlich viel Erfahrung mit C bzw C++ gemacht habe und es mir deshalb manchmal schwer fällt mir etwas zu überlegen wovon ich dann nicht mal sicher sein kann das das überhaupt funktioniert.Deshalb läufts bei mir öfters auf das "try and error" Prinzip hinaus.

    @locus vivendi:
    Danke für die Links!

    edit:
    Gerade eben bin ich auf einen Fehler gestoßen der mich verwirrt.Das unten stehende Programm hab ich zusammen mit 2 Parametern asgeführt,wobei der erste die Quelldatei sein soll und der zweite die Zieldatei.
    Beim ersten mal ausführen hat das ganze wunderbar geklappt,doch jetzt produziert das Programm falsche Umwandlungen(Compiler Fehler tritt keiner auf). Ohne Parameter funktioniert das Programm auch ohne Fehler,deshalb kann meines Erachtens der Fehler nur bei der Parameterübergabe liegen?!
    Code:
    #include<iostream>
    
    using namespace std;
    int main(int argc,char  *argv[])   //Parameter:                         1.Parameter für Quelldatei            2.Parameter für Zieldatei
    {
    	
    	
    	FILE *datei;  //dateizeiger
    	datei=fopen(argv[1],"r");   //Textdatei "laden"
    	char string[800],umwandlung[800];
    	while(fgets(string,80,datei))  //zeilenweises ausgeben am Bildschirm
    	{
    		puts(string);
    	}
    	int laenge =strlen(string);  //schauen wie lang der String ist
    	fseek(datei,0,0); //Dateizeiger an den Anfang setzen
    	for(int rauf_zaehler=0;rauf_zaehler<=laenge;rauf_zaehler++)
    	{
    		umwandlung[rauf_zaehler]=(char)umwandlung[rauf_zaehler];  //Umwandlung nach char
    		umwandlung[rauf_zaehler]+=1;
    		fseek(datei,1,1);
    	}
    	
    	cout<<umwandlung<<endl;
    	
    	datei=fopen(argv[2],"w");
    	fputs(umwandlung,datei);
    	}
    edit2: Ich habe jetzt ein ältere Version von dem Programm geladen(dort wo ich noch diese schrecklich schlichte Benennung hatte) und dort das Programm so modifiziert sodass man Parameter übergeben kann,mit dem gehts jetzt komischerweise.


    edit: Ich möchte mich nun noch mal bei allen Leuten hier im Forum für die Hilfe bedanken.
    Hat super geklappt!


    mfg klicke
    Geändert von klicke (20-09-2006 um 17:04 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •