Möchte INI Datei Bearbeiten
-
Bsp.
Ein Chek Button , ich Clicke auf den button und das ';' wird auskomentiert oder umgekehrt
mein problem
GetPrivateProfileString liest nur die erste Zeile aus
is ja eigentlich logisch da sie beide den selben key haben
wenn ich mehrere anfragen sendebsp:
[cpp] GetPrivateProfileString("TESTCON", "extension" , "Test-Fehler" , buffer1, sizeof(szIniFile), "my.ini"); GetPrivateProfileString("TESTCON", "extension" , "Test-Fehler" , buffer2, sizeof(szIniFile), "my.ini"); [/cpp]
-
Ascharan schrieb:
GetPrivateProfileString liest nur die erste Zeile aus
is ja eigentlich logisch da sie beide den selben key habenLogische Folgerung: Du kannst es für deine Anwendung nicht verwenden, sondern mußt die Datei per Hand durchforsten und die Semikolon's einfügen/löschen (denk dabei dran, daß du alles hinter derauskommentierten Zeile weiterschieben mußt).
PS: Oder du baust die Struktur der INI-Datei so um, daß in jeder Zeile ein anderer Schlüsselwert steht, z.B.:
[TESTCON] mylib0.dll=ACTIVE mylib1.dll=ACTIVE mylib2.dll=ACTIVE mylib3.dll=INACTIVE mylib4.dll=ACTIVE mylib5.dll=ACTIVE
-
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
;/DllExtdas 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
