Ansi Zeichen ersetzen



  • Hallo Zusammen.

    Ich habe einige grosse Textdateien, welche von einem CAD Programm exportiert wurden. Nun wurden bei diesen Textdateien die Sonderlaute öü durch andere Zeichen ersetzt:
    ü = 
    ö = ”

    So nun dachte ich mir ich schreibe ein kleines Script um die zwei Zeichen wieder umzuwandeln.

    Leider funktioniert das ganze nicht so wie es sollte. 1. Wandelt er die Zeichen nicht um und 2. ist am Ende der Datei dann noch ein Zeichen angehängt.
    Kann mir jemand da helfen? Danke.

    BSP:

    Datei zu Beginn:

    Das
    
    ist
    ”
    ein Test
    

    Datei zum Schluss:

    Das
    
    ist
    ”
    ein Test
    ÿ
    

    Und zum Schluss noch der Quelltext (ist aus irgendeinem Artikel im Forum und minimal abgeändert):

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
    
       FILE *Datei,*Output ; 
       char szName[100],szNameOutput[100]; 
       int cRead; 
       char szErsatz[10]; 
       printf ("Dateiname eingeben : "); 
       scanf ("%s",szName); 
       sprintf(szNameOutput,"_%s",szName); 
       if((Datei = fopen (szName , "r"))==NULL) 
       { 
          printf("\nfehler beim oeffnen\n"); 
          return 0; 
       } 
    
       Output = fopen(szNameOutput,"w"); 
    
       while(!feof(Datei)) 
       { 
          //Zeichen lesen 
          cRead=fgetc(Datei); 
    
          //jetzt entsprechenden Output schreiben 
    
          switch(cRead) 
          { 
          case '': 
             sprintf(szErsatz,"ü");//oder strcpy(szErsatz,"1234"); 
             break; 
          case '”': 
             sprintf(szErsatz,"ö"); 
             break; 
          default: 
             szErsatz[0]=cRead;//leer 
             break; 
          } 
          fprintf(Output,"%s",szErsatz); 
    
       } 
       fclose (Datei); 
       fclose(Output); 
    
       printf("fertig ;)\n"); 
      system("PAUSE");	
      return 0;
    }
    


  • das hier

    fprintf(Output,"%s",szErsatz);
    

    .... solltest du auch nochmal in

    if(!eof) {}
    

    kapseln. daher kommt wahrscheinlich das komische zeichen am schluss, da er auch schreibt, wenn das EOF gemeldet wurde.

    aber an deiner stelle würde ich das ganz anders und viel simpler machen, in etwa so:

    int inputChar = 0;
    
    while(inputChar != EOF) {
    
      inputChar = fgetc(inFilePointer); // also komplett einzeln byte für byte
    
      if(inputChar != EOF) { // damit er nur schreibt, wenn nicht ende des files
    
        if(inputChar == '\"') {fputc('ä', outFilePointer);} // komisches zeichen 1
        if(inputChar == '§') {fputc('ö', outFilePointer);} // komisches zeichen 2
        if(inputChar == '~') {fputc('ü', outFilePointer);} // komisches zeichen 3
        else {fputc(inputChar, outFilePointer);} // alles andere
      }
    
    }
    


  • mal ne generelle frage

    kann man eigentlich die return werte weglassen wenn man das programm nachträglich nicht auf fehler prüft

    sprich zweimal return 0 macht ja keinen sinn weil man dannn erst nicht weiss ob das programm funktioniert hat oder nicht



  • Danke für die schnelle Antwort.

    Deine Methode ist wirklich besser. Nur bei deiner else Anweisung klappts nicht ganz 🙂

    Der schreibt die ersten beiden Zeichen trotzdem hinein, da die else Anweisung nur für den Dritten Fall zählt.

    Nun habe ich aber immer noch ein Problem. Das ersetzen von normalen Buchstaben und Zahlen funktioniert tadellos aber sobalds eben an solche Sonderzeichen geht klappts nicht mehr.

    Idee: Wäre es sinnvoll die Zeichen per ANSI Code zu symbolisieren und wenn ja, wie mache ich das in C?



  • Peace_VsC schrieb:

    mal ne generelle frage

    kann man eigentlich die return werte weglassen wenn man das programm nachträglich nicht auf fehler prüft

    sprich zweimal return 0 macht ja keinen sinn weil man dannn erst nicht weiss ob das programm funktioniert hat oder nicht

    Na klar. Aber ob das Sinn macht ist die andere Frage. Was willst du z.B. statt dem ersten return 0; verwenden? goto ende_des_programms? exit(0)?
    Hier ist imho return 0; schon die beste Lösung (wobei ich trotzdem return 1; schreiben würde... man kann ja nie wissen was man in der Zukunft eventuell noch alles überprüfen möchte ;))

    Caipi



  • Hat sich erledigt 🙂

    War ganz einfach... muss doch erstmal auf sowas kommen 🙂
    Ich hab jetzt mal aus Spass den Inhalt von inputChar als Integer ausgeben lassen und die Zahlen die ich da erhalten haben in die switch anweisung eingebaut und siehe da es funktioniert.

    Danke vielmal für die Hilfe. 😃



  • Hmm da kommt mir noch gerade eine Frage in den Sinn:

    Da die Dateien, welche solche Verfälschungen beinhalten relativ lange und nervige Namen haben, habe ich mir überlegt, ob es möglich ist einem c-Programm zu sagen, das eine Datei die per Drag n Drop aufs Exe File gezogen wurde, bearbeitet werden soll.

    Ist das Möglich?
    Mit Hilfe von einem Batch-File habe ich es leider nicht geschafft.



  • Da laeuftst in einen widerlichen Bereich hinein:

    Der ASCII-Satz ist nur definiert bis 125 - d.h. das erste Bit im 8-Bit-Word ist immer 0. Wenn Dort ein Bit auftaucht, dann muss fuer die Ausgabe der Zeichensatz definiert werden (z. B. fuer West-Europa ISO-8859-1; fuer andere europaeische Schrifttypen gelten andere Saetze). Damit aber nicht genug daneben gibt es den UNICODE (eine 16-Bit Encoding-Table und - neben andrenen Verschluesselungen die haeufige UTF-8 Encoding).

    Alle Schriften der ISO-8859-X, des US-ASCII und der UTF-8 haben gemeinsam die ersten 125 Zeichen. Fuer alle hoeheren Codes muss angeben werden, welche Encoding-Tabelle verwendet wird. Das muss aber Dein Interface nach aussen machen. Das hat nichts mehr mit dem C-Programm selber zu tun.



  • Sag das mal den Leuten die die Textfiles erstellen 😉

    Ds Problem mit dem Drag n Drop hat sich in der Zwischenzeit auch gelöst



  • Ich habe das Programm jetzt eigentlich soweit, dass Drag n Drop funktioniert und die Datei geöffnet werden kann etc.
    Nur funktioniert das Schreiben nur bei der Methode mit der manuellen Eingabe, nicht beim Drag n Drop.

    Kann sich jemand den Quellcode mal anschauen? Ich komm echt nicht mehr weiter.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
       /* File Pointer und Variablen für das In und Output File */
       FILE *Datei,*Output ; 
       char szName[256],szNameOutput[256]; 
       char dPfad[156],dName[100];
       /* Gewünschte Datei eingeben und aus der Datei den Namen der Bearbeiteten
          erstellen */
       if(argv[1]==NULL) {    
          printf ("Dateiname eingeben : ");               
          scanf ("%s",szName);
          sprintf(szNameOutput,"_%s",szName);  
       }      
       else {
          /* In szName die Datei mit vollständigem Pfad angeben */
          sprintf(szName,"%s",argv[1]);   
          /* Den übergebenen String auseinandernehmen und den Dateinamen 
             speichern */   
          int i = 1; 
          char* pToken = strtok(argv[1], "\\"); 
          if (pToken) { 
             i++; 
             while ( (pToken = strtok(NULL, "\\")) ) {  
               i++; 
               sprintf(dName,"%s",pToken);
             } 
          }
          sprintf(szNameOutput,"_%s",dName);  
       }
    
       /* Kann die zu bearbeitende Datei geöffnet werden?*/ 
       if((Datei = fopen (szName , "r"))==NULL) 
       { 
          printf("\nfehler beim oeffnen\n"); 
          system("PAUSE");	
          return 0; 
       } 
    
       // Datei zum schreiben
       Output = fopen(szNameOutput,"w"); 
       /* Zeichen für Zeichen auslesen und bearbeiten */
       int inputChar = 0; 
       while(inputChar != EOF) {              
          inputChar = fgetc(Datei); 
          if(inputChar != EOF) {                   
             /*Überprüfen und Ersetzen*/
             switch(inputChar) {
                /*Das Zeichen ”*/
                case 148:
                   fputc('ö', Output);
                   break;   
                /*Das Zeichen */   
                case 129:
                   fputc('ü', Output);
                   break;  
                /*Alle anderen Zeichen*/       
                default:
                   fputc(inputChar, Output);
                   break;                
             }
          } 
       }  
       /* Dateien schliessen, Programm beenden*/
       fclose(Datei);
       fclose(Output);
    
       printf("fertig ;)\n"); 
       system("PAUSE");	
      return 0;
    }
    


  • kein bock das zu analyisieren. aber: //EDIT: war stuss, geht doch.

    und: wenn du eine datei auf eine EXE ziehst, wird im endeffekt einfach der pfad\dateiname dieser datei als erstes parameter übergeben....

    verstehe nicht genau was du mit "schreiben geht nicht" meinst.

    irgendwie scheint mir, du denkst, dass du auch den outFileName bei drag'n'drop automatisch per parameter bekommst. dem ist nicht so.



  • Ne dachte ich auch nicht 🙂

    Problem hat sich in der Zwischenzeit gelöst.


Anmelden zum Antworten