Möchte INI Datei Bearbeiten



  • Ich bin jetzt mal ganz frech und sage euch: nehmt Pascal. Meine Spontan-Lösung ist so einfach, dass sie jeder verstehen sollte, der schon jemals ein Programm geschrieben hat.

    program iniedit;
    uses crt;
    const 
      datnam: shortstring = 'C:\bla\bla.ini';
      tmpdatnam: shortstring = 'C:\bla\bla2.ini';
    var
      in, out : file of text;
      buf : shortstring;
      i, strpos: byte;
      c : char;
      valid : boolean = false;
    
    begin
      clrscr;
      window(5,5,80,25); {Sieht besser aus}
      writeln('Also, welche Zeilen wollen sie jetzt an / aus schalten?',#13);
      assign(in, datnam); {Dateinamenszuweisung}
      reset(in); {in zum Schreiben öffnen}
      assign(out, tmpdatnam);
      rewrite(out); {out zum Schreiben öffnen}
      repeat
        readln(in, buf);
        writeln(out, buf);
      until buf = '[TESTCON]';
      repeat
        readln(in, buf);
        if buf[1] = ';' then delete(buf, 1, 1);
        repeat
          write(copy(buf,pos('=',buf)+1,ord(buf[0])-pos('=',buf)),' [E/A]'); {ich gehe von extension=bla.dll aus}
    
          c := upcase(readkey);
          case c of
            'E' : begin
               valid := true;
            end;
            'A' : begin
               buf := ';' + buf;
               valid := true;
            end;
            else writeln('Falsche Eingabe!!');
          end;
        until valid;
        writeln(out,buf);
      until eof(in);
      close(in);
      close(out);
      erase(in);
      rename(out, datnam);
    end.
    

    Naja, so in etwa dürfte das gehen.
    Tschö,
    nullplan



  • Toller Code versuch es mal umzudenken benutze aber denoch c++

    CStoll (off) die ini kann ich nich so einfach umbauen da extension das modul ist das das programm laden soll

    thx für eure ratschläge



  • Ascharan schrieb:

    CStoll (off) die ini kann ich nich so einfach umbauen da extension das modul ist das das programm laden soll

    Wenn du dieses Modul ändern kannst, dürfte das kein Problem sein 😉
    (ansonsten bleibt wohl nur die von-Hand-Methode)

    (ein Tip, wie du die notwendige Dateiverarbeitung minimieren kannst - setz ein Leerzeichen hinter den String, dann hast du notfalls Platz für das Kommentar-";")



  • Was hab ich denn da für Schwachfug geschrieben? Nach ein paar mal benutzen sieht die Zeile dann in etwa so aus "; ; ; extension=bla.dll" Tjo, auskommentiert ist auskommentiert. Ich ändere das Programm noch. Hmm... was bräuchten wir für eine C-Umsetzung der ganzen Schose? Also, kann man in C auf 2 Strings den +-Operator loslassen, oder versucht er dann die Zeichencodes zu addieren? Wenn letzteres, wie kann ich 2 Strings zusammenhängen? Und wie das erste Zeichen eines Strings löschen? Idee: nehmen wir den Puffer vom Typ char*, dann brauchen wir bloß 1 zur Basisadresse zu addieren und schon ist das Zeichen weg. Naja, ansonsten brauchen wir bloß C-Pendants zu erase und rename. Und die entsprechenden Header-Files. Und dann geht das.
    Tschö,
    nullplan



  • nullplan002 schrieb:

    Was hab ich denn da für Schwachfug geschrieben? Nach ein paar mal benutzen sieht die Zeile dann in etwa so aus "; ; ; extension=bla.dll" Tjo, auskommentiert ist auskommentiert.

    Wer schreibt hier Schwachfug? Natürlich muß man VOR der Änderung kontrollieren, ob dort schon ein Semikolon steht.

    Also, kann man in C auf 2 Strings den +-Operator loslassen, oder versucht er dann die Zeichencodes zu addieren? Wenn letzteres, wie kann ich 2 Strings zusammenhängen?

    WEder noch - Zeiger-Addition wird überhaupt nicht compiliert. Dafür gibt es in C die Funktion man: strcat.

    Und wie das erste Zeichen eines Strings löschen? Idee: nehmen wir den Puffer vom Typ char*, dann brauchen wir bloß 1 zur Basisadresse zu addieren und schon ist das Zeichen weg.

    Ja, das wäre ein Ansatz 😉

    Naja, ansonsten brauchen wir bloß C-Pendants zu erase und rename. Und die entsprechenden Header-Files.

    Da braucht man zum Glück nicht lange zu suchen - die heißen man: remove und man: rename (und finden sich in der <stdio.h> wieder)



  • Nu, denn wolle mer mal:

    #include <stdio.h>
    #include <string.h>
    
    const char datnam[]="C:\bla\bla.ini";
    const char tmpdatnam[]="C:\bla\bla2.ini";
    
    FILE* inf, outf;
    char* buf;
    short int i;
    char c;
    bool valid=false;
    
    int main()
    {
      printf("Welche Extensions gedenken Sie auszuschalten?\n\n");
      inf = fopen(datnam, "rt");
      outf = fopen (tmpdatnam, "w+t");
      buf = malloc(1024);
      if ((inf == NULL) || (outf == NULL) || (buf == NULL)) return 1;
      do
      {
        buf = strcat(fgetln(inf, NULL), "\0");
        fprintf(outf, buf);
      } while (buf <> "\n[TESTCON]");
      do
      {
        buf = strcat(fgetln(inf, NULL), "\0");
        if (buf* = ";") buf++;
        do
        {
          printf("%s [E/A] ",buf[10]);
          c = toupper(getchar());
          select (c)
          {
            case "E":
                {
                   valid = true;
                   break;
                }
            case "A":
                {
                   valid = false;
                   buf = strcat(";", buf);
                   break;
                }
            default: printf("\nFalsche Eingabe!!\n");
          } 
        } while (!valid);
        fprintf(outf, buf);
      } while (!getc(inf)==EOF);
      fclose(inf);
      fclose(outf);
      remove(datnam);
      rename(tmpdatnam, datnam);
      free(buf);
      buf = NULL;
      return 0;
    }
    

    That should be it. Wo nicht, so nennt mir das Problem. Mal sehen ob ich es beheben kann.
    B Cin ya!
    nullplan



  • nullplan002 schrieb:

    /* Wenn im folgenden die Fkt. "noidea" aufgerufen wird, ist das eine Fkt. zum 
       * Lesen einer Zeile, also vom Filepointer bis zum nächsten Linefeed. 1. 
       * Argument ist die Datei. 2. Argument ist die Variable, in die das einzulesen 
       * ist. Möglichst sollte die Fkt. nicht den Filepointer hinter den EOL, 
       * sondern drauf setzen. Siehe Abbruchbedingung Außenschleife.
       */
    

    hast du dir eventuell mal man: fgets angesehen?

    Außerdem vermisse ich in deinem Programm noch die Speicher-Anforderung (und Freigabe) für 'buf'. Und ein paar kleinere Fehler bei der Parameterübergabe für printf sind auch noch drin (namentlich "printf("%s [E/A] ",buf+10);").

    PS: Und wenn die Extension abgeschaltet werden soll, müsstest du noch ein Semikolon davorsetzen.



  • Also, noidea habe ich gekillt, das Semikolon wird jetzt auch gesetzt, und was das mit dem Speicher angeht: Wieviel soll ich da nehmen? Na gut, mehr als 1 kB werd ich nicht brauchen, also ist das auch gefixt.
    Tschö,
    nullplan



  • nullplan002 schrieb:

    Also, noidea habe ich gekillt,

    Schonmal positiv - wie sieht denn eigentlich dein fgetln() aus?

    das Semikolon wird jetzt auch gesetzt,

    So, wie du das machst, führt das aber zu einem SegFault (strcat kopiert hinter den String im ersten Parameter - und hinter ein String-Literal kann man nichts kopieren). Du könntest ja das ';' direkt in die Ausgabedatei schreiben, wenn es benötigt wird.

    und was das mit dem Speicher angeht: Wieviel soll ich da nehmen?

    Genug 😉
    (spätestens an der Stelle sieht man den Vorteil der C++ std::string's - die holen sich selber genug Speicher für ihre Daten)



  • Lässt sich die Liste einlesen

    wie bsp:

    eine Makierung im Text

    ;DllExt
    extension=MyDLL0.Dll
    ;extension=MyDLL1.Dll
    ;/DllExt

    das er mir alle extensions einließt von ;DllExt bis ;/DllExt



  • Klar geht das. Einfach bis ';DLLExt' kopieren, dann Liste in ein Array saugen:

    char* List[255];
    int i = 0;
    while (buf <> ';/DLLExt')
    {
      buf = strcat(fgetln(inf, NULL), "\0")
      List[i++] = buf;
    }
    

    Und das Array dann bearbeiten. Einfach, oder?
    Tschö,
    nullplan



  • sieht einfach aus ! 😕

    Ich hoffe ich bekomme das noch hin 😃


Anmelden zum Antworten