Zeichenlängen in .txt erkennen
-
DirkB schrieb:
Belli schrieb:
Vielleicht liegt es auch daran, dass > im Dateinamen nicht zulässig ist?!
Genau darum geht es unter 3.3.2 in dem Wikipediaartikel.
Jo danke für den hinweis
Manchmal stellt man sich einfach nur dumm an xDDUnd nochmal danke an euch, dass ihr soviel geduld mit mir habt
will euch echt nich nerven.
Find ich gut
-
heyjo
(und weiter geht der anfänger-Spaß :D)
Das Programm funktioniert nach Kompilieren, wie es soll (Dank an der Stelle).
Nun möchte ich noch eine .ini Datei hinzufügen (oder etwas Ahnliches), damit der User den durchsuchenden Pfad auch ändern kann. (Falls ihr dafür ne bessere Idee habt: ich bin für alles offen :))Die *.ini hab ich angelegt, jedoch kann ich sie ja nicht über
#include "PathConfig.ini"
implementieren. (oder doch? mir wurde gesagt, dass funktioniert nicht).
Des Weiteren möchte ich ja auch im Programm auf den, vom User eingegebenen Pfad zugreifen:
FILE *f = _popen("dir /s /b /ad C:\\", "r"); //PathConfig.ini
Folgendes gefunden: http://stackoverflow.com/questions/22138959/c-getprivateprofilestring-read-ini-file-from-current-directory
Hier wird die Funktion
GetPrivateProfileString
erklärt. (bzw. empfohlen) . (Bitte nicht loslegen mit: Das steht doch alles da) .
Wie kann ich nun meinen Pfad, der in der *.ini steht, in mein Programm an dieser Stelle einfügen und verwenden?Beste Grüße
Lordakius
-
Hab mittlerweile eine eigene Lösung entwickelt, jedoch ohne *.ini:
FILE *f = _popen("dir /s /b /ad ..\\", "r"); //Pfad.ini
Die zwei Punkte sollen auf das vorherige Verzeichnis verweisen, da das ganze Projekt in einem Ordner bleibt.
Nicht die galanteste Lösung aber denke fürs Erste passt das schon.
Falls ihr trotzdem weitere Lösungsvorschläge habt, nehm ich sie gerne entgegen
beste Grüße
Lordakius
-
Schau dir mal die Paramter von
main
an.
Die werden i.A.argc
undargv
genannt und sind genau dafür da.Den String musst du dir aber noch zusammen basteln. (oder du übergibst das ganze Kommando)
int main(int argc, char **argv) { char cmnd[1000] = "dir /s /b /ad "; if (argc > 2) strcat(cmnd, argv[1]); else strcat(cmnd, ""); // oder auch ".." ....
-
Die werden i.A. argc und argv genannt und sind genau dafür da.
Aber musste man die nicht beim Ausführen eingeben? (kenn das nur in cmd aufrufen.)
Oder kommt dann "ganz" am anfang eine eingabeaufforderung dafür?if (argc > 2) strcat(cmnd, argv[1]); else strcat(cmnd, "");
Könntest du mir erklären, was da genau passiert ?
Ich kann mir das nicht so richtig herleiten ....1."" ist dasselbe wie ..? oder was meinst du mit ""?
2.argc > 2 => wenn mehr als 2 Argumente geliefert werden?
3.argv[1]? du übergibst ein String mit einem Element? Aber wenn der User C:\\ eingibt (z.B.) sind das doch 4 Elemente (mit terminationszeichen) .
4. (char **argv? Warum ein Doppelpointer? (ich kenn's so, aber habs noch nie verwendet ... also rein logisch erscheint mir ein doppelpointer merkwürdig
Will doch keine Adresse für ne Adresse einlesen (oder doch?))
Dann wäre das so oder wie?:
FILE *f = _popen("dir /s /b /ad %s", "r", cmnd);
Gibts vllt auch ne Möglichkeit, dass der User das Verzeichnis auswählen kann, ohne dass er den gesamten Pfad eingeben muss?
Beste Grüße
LordakiusPS: und danke für die Hilfe ^^ ohne euch wäre ich aufgeschmissen
-
Hab das mal ausprobiert:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { char cmnd[1000] = "dir /s /b /ad "; if (argc > 2) strcat(cmnd, argv[1]); else strcat(cmnd, ""); // oder auch ".." printf("%s\n", cmnd); printf("%i\n", argc); printf("%s\n", argv); system("PAUSE"); }
Dabei kamen sehr merkwürdige ergebnisse.
AUSGABE:- dir /s /b /ad
- 1
- *l //(L)
cmnd stimmt ja noch aber das andere ist iwie merkwürdig .. habt ihr ne erklärung dafür?
-
Lordakius schrieb:
1."" ist dasselbe wie ..? oder was meinst du mit ""?
Einen Leerstring.
Der macht da nichts, aber dafür stand ja der Kommentar dahinter.Lordakius schrieb:
2.argc > 2 => wenn mehr als 2 Argumente geliefert werden?
Sorry, da muss
> 1
heissen.== 2
geht auchargv
ist ein Array mit Zeigern aufchar
.
Jedes Element von dem Array zeigt auf ein Argument.Und ja, du musst es als extra Paramter angeben.
Es ist ein Konsolenprogramm und die ruft man in der Konsole auf und nicht per Doppelclick.
-
DirkB schrieb:
Und ja, du musst es als extra Paramter angeben.
Es ist ein Konsolenprogramm und die ruft man in der Konsole auf und nicht per Doppelclick.stimmt ja xDD
Aber ich könnte doch eine Batch-Datei schreiben, die das Programm mit dem entsprechenden Befehl aufruft. Wie sehe das dann aus? //sähe? Grammatik ftw"C:\[Eingabe vom User vor Programmstart]" -pfadlängenprogramm.exe
als Batch.
Die startet dann das Programm, welches die Eingabe vom User als Pfad zum Suchen nimmt. Es wäre akzeptabel, wenn es funktioniert. Da möchte ich jetz dran arbeiten^^#edit:
Da mein main-Funktionskopf ja so aussieht:int main(int argc, char **argv[]) //sind die [] falsch?
muss ja die Batch argc und argv übergeben . Wie macht man das?
FILE *f = _popen("%s", cmnd "r"); //Pfad.ini
Ist die Codezeile richtig oder hab ich wieder die Syntax verdreht (die ich immer noch nich kenne
)
Er sagt auf jeden Fall, dass ein ( fehlt. muss das cmnd vllt hinter "r"?if (argc > 2) strcat(cmnd, argv[1]);
btw. ist das eigentlich zulässig? Fehlen da nicht die Block-Klammern {}.
Hab gelernt, dass man das bei nur einem Ausdruck so schreibt:if (argc > 2) strcat(cmnd, argv[1]);
und ansonsten
if (argc > 2) { strcat(cmnd, argv[1]); }
Beste Grüße
Lordakius
-
Du kannst in der Verknüpfung zum pfadlängenprogramm unter Ziel noch ein %1 anhängen.
"C:\Pfad zum Programm\pfadlängenprogramm.exe" %1
Und dann aus dem Winows-Explorer das Icon vom Verzeichnis daraufziehen.
Lordakius schrieb:
int main(int argc, char **argv[]) //sind die [] falsch?
Die [] oder ein *
Lordakius schrieb:
FILE *f = _popen("%s", cmnd "r"); //Pfad.ini
Die
xprintf
- ,xscanf
-Funktionen undstrftime
sind die einzigen aus dem C-Standard, die mit Formatstrings umgehen können. Was meinst du, warum cmnd erst zusammen gebaut habe.
Schau in einer Referenz zu_popen
nach wie die Parameter sind und was sie bedeuten.Und der Rest ist doch alles gleich.
strcat
ist nur eine Anweisung nach demif
.
Der Zeilenumbruch hat da keine Bedeutung.Die Blockklammern nimmst du, wenn du mehrerer Anweisungen zusammenfassen willst, damit sie wie eine aussehen.
Lordakius schrieb:
printf("%s\n", argv);
Das ist falsch , da bei %s ein
char*
erwartet wird. Du übergibst aber einchar**
. Großer Unterschied.int main(int argc, char **argv) { int i; for(i=0;i<argc;i++) printf(%d. Argument: "%s\n", argv[i]); }
-
DirkB schrieb:
Du kannst in der Verknüpfung zum pfadlängenprogramm unter Ziel noch ein %1 anhängen.
"C:\Pfad zum Programm\pfadlängenprogramm.exe" %1
Aber dann bitte mit Anführungsstrichen:
"%1"
-
oenone schrieb:
DirkB schrieb:
Du kannst in der Verknüpfung zum pfadlängenprogramm unter Ziel noch ein %1 anhängen.
"C:\Pfad zum Programm\pfadlängenprogramm.exe" %1
Aber dann bitte mit Anführungsstrichen:
"%1"
Und was bedeutet das %1?
-
Das ist der Platzhalter für den ersten übergebenen Parameter.
Das ist aber Batchprogrammierung* und hat nichts mit C zu tun.Und die Anführungszeichen sind wichtig, weil irgendwelche
Leerzeichen in Dateinamen/Pfaden zugelassen haben.
*Nicht direkt, aber es ist von der Batchprogrmmierung übernommen.
-
Könnte man das gewünschte Verzeichnis nicht direkt auf die *.exe ziehen? Zumindest mit Dateien funktioniert dies (natürlich nur, wenn die *.exe dann auch was mit den Dateien anfangen kann).
-
Belli schrieb:
Könnte man das gewünschte Verzeichnis nicht direkt auf die *.exe ziehen? Zumindest mit Dateien funktioniert dies (natürlich nur, wenn die *.exe dann auch was mit den Dateien anfangen kann).
Ne das geht leider nicht.
Es handelt sich bei den Ordnern um 7 TB Ordner ^^
Da würde das Ziehen länger dauern als die eigentliche Funktion des ProgrammsIch habe mittlerweile (noch mal zusammenfassend) ein paar Ideen entwickelt:
-> man schreibt eine BATCH-Datei, die den Pfad an das Programm übergibt. Einstellen kann der User den Pfad "in" der BATCH-Datei.
-> Man entwickelt eine GUI, in der man den Pfad des Verzeichnisses auswählt, dieser wird dann übergeben und zum String cmnd mittels
strcat
zugegeben (mir fällt grad kein besseres Wort ein). Somit stellt der User den Pfad innerhalb einer GUI ein (ohne schreiben, Klicki-Klicki versteht sich :D).
Das sind meine Ideen, die BATCH könnte ich noch selber schreiben, aber die Schnittstelle ist etwas problematisch. Man müsste den Pfad ja zurückgeben, aber wie ich das aus einer BATCH mache, weiß ich nich. (vllt mit fopen "r"? ... Nur ne Vermutung
)
einen guten morgen wünscht
Lordakius
-
Lordakius schrieb:
Belli schrieb:
Könnte man das gewünschte Verzeichnis nicht direkt auf die *.exe ziehen? Zumindest mit Dateien funktioniert dies (natürlich nur, wenn die *.exe dann auch was mit den Dateien anfangen kann).
Ne das geht leider nicht.
Es handelt sich bei den Ordnern um 7 TB Ordner ^^
Da würde das Ziehen länger dauern als die eigentliche Funktion des ProgrammsDa wird nur der Ordnername übergeben (wieviel Zeichen mögen das maximal sein?
), keine Dateien kopiert.
-
Belli schrieb:
Könnte man das gewünschte Verzeichnis nicht direkt auf die *.exe ziehen?
Jau, geht, gerade mal mit einem kleinen Beispielprogramm getestet ...
-
Nein, mir wurde das anders erklärt:
Der Ordner muss initialisiert werden, damit das Programm etwas damit anfangen kann. Da der Ordner entsprechend groß ist, dauert die Initialisierung entsprechend lange.
Habe die Batch (bzw *.ini ^^) jetz geschrieben. (sieht mir mehr nach einer header aus ... aber gut was weiß ich schon :D)
char *getPath() { static char Path[] = { "C:\\Users\\Lordakius\\Desktop\\Informatik"}; return Path; }
#include "Pfad.ini" //[...] int main(/*int argc, char **argv*/) { char cmnd[1000] = "dir /s /b /ad "; strcat(cmnd, getPath()); char eingabe; //Hier ist alles noch wie vorher :)
Also er machts auf jeden fall
Mit ner GUI wäre es natürlich benutzerfreundlicher, aber damit komme ich jetzt noch nicht klar.
Aber mal nebenbei: in einer csv (oder cvs?) Datei in Excel entspricht ein [;] einem Spaltensprung (nennt man das so?). Nun wäre es noch nice, wenn man im Pfad-String (bei der Ausgabe) alle \ durch ; ersetzt.
Meiner Meinung sollte das einfach über eine Funktion gehen, die in der text-Datei (bzw csv) die entsprechenden Zeichen ersetzt. Ich hab da an stream-Funktionen gedacht gedacht (ist ja mittlerweile nicht mehr komplett neu das Thema :D).Danke an Alle für die bisherige Hilfe
Beste Grüße
Lordakius
-
Lordakius schrieb:
Nein, mir wurde das anders erklärt:
Der Ordner muss initialisiert werden, damit das Programm etwas damit anfangen kann. Da der Ordner entsprechend groß ist, dauert die Initialisierung entsprechend lange.
Das eine hat mit dem anderen nicht das Geringste zu tun. Irgendwie muss Dein Programm ja an die Information kommen, welchen Ordner es bearbeiten soll.
Und den entsprechenden Ordner mit der Maus auf die exe-Datei Deines Programms zu ziehen, ist da eine sehr einfache Möglichkeit und kommt von der Benutzerfreundlichkeit schon mal in die Nähe eines mit einer GUI ausgestatteten Programmes, welches Du mit Deinen Kenntnissen vermutlich nicht hinbekommen wirst.
-
Belli schrieb:
Lordakius schrieb:
Nein, mir wurde das anders erklärt:
Der Ordner muss initialisiert werden, damit das Programm etwas damit anfangen kann. Da der Ordner entsprechend groß ist, dauert die Initialisierung entsprechend lange.
Das eine hat mit dem anderen nicht das Geringste zu tun. Irgendwie muss Dein Programm ja an die Information kommen, welchen Ordner es bearbeiten soll.
jau, dass mach ich ja mit der Batch Datei. kannst du mir erklären was du mit deinem ersten Satz meinst? Wie gesagt, kenn mich in dem Bereich nicht so richtig aus.
Und den entsprechenden Ordner mit der Maus auf die exe-Datei Deines Programms zu ziehen, ist da eine sehr einfache Möglichkeit und kommt von der Benutzerfreundlichkeit schon mal in die Nähe eines mit einer GUI ausgestatteten Programmes, welches Du mit Deinen Kenntnissen vermutlich nicht hinbekommen wirst.
Womit fängt denn so eine GUI an? Hab was gehört von wegen Frameworks ...
was muss ich mir anschauen, damit ich lerne wie eine GUI aufgebaut ist?
Kannste mir was empfehlen?#edit:
FILE *f = _popen(cmnd, "r");
Hab ich da was falsch gemacht? er gibt jetzt nicht das aus was in cmnd steht (bzw in cmnd steht ja der cmd befehl + pfad) sondern was auf meinem desktop is.
Kann auch gerne nochmal den kompletten Code posten, wollte nur nich das gesamte fenster ausfüllen^^##Edit:
Anscheinend funktioniert das Programm außerhalb meines Release-Ordners nicht ordnungsgemäß. Im Release Ordner macht das Programm genau was es soll. Ich glaube die Verknüpfung zur path.ini ist noch fehlerhaft. Die path.ini muss doch eigentlich im selber Verzeichnis sein.
lg Lordakius
-
Das mit der Batch-Datei ist umständlich und was Du da gepostet hast:
char *getPath() { static char Path[] = { "C:\\Users\\Lordakius\\Desktop\\Informatik"}; return Path; }
hat überhaupt nix mit einer Batch-Datei zu tun.
Eine Lösung mit einer Batch-Datei macht bei Deinem Problem nur dann Sinn, wenn immer wieder derselbe Ordner verarbeitet werden soll. Dann aber könntest Du den auch direkt im Programm verdrahten.
Bei wechselnden Ordnern macht es Sinn, diesen einfach als Aufrufparameter mitzugeben. Und stattdessen kann man dann auch einfach den Ordner auf die exe-Datei ziehen.
Bevor Du Dich mit GUI-Programmierung beschäftigst, solltest Du erst mal einige Grundlagen lernen.