Zeichenlängen in .txt erkennen



  • Hmm nach Beachten der fprintf-Zeile seh ich nun, dass "datei" ein Null-pointer ist. Demnach muss fopen("AllData>255.cvs", "w"); einen NULL-Pointer erzeugen, oder nicht?

    int main()
    {
    	char zeile[10000];
    	FILE *f = _popen("dir /s /b /ad C:\\", "r");   //r=>read?
    		if (!f) return 1;
    		printf("Loading ... Please Wait!\n");
    		FILE *datei;
    		datei = fopen("AllData.cvs", "w");  //w=>write? das heißt doch öffnen zum schreiben oder nicht? ^^
    		while (fgets(zeile, 10000, f))
    		{
    
    			int len = (strlen(zeile));
                            printf("%s",datei);		//Dies ist zum Testen des Inhalts von Datei .... <null>
    			system("PAUSE");
    			fprintf(datei, "%i;%s\n", len, zeile);   //Schwerwiegender Fehler ... wegen NULL-Pointer?
    		}
    	_pclose(f);
    	system("PAUSE");
    	return 0;
    }
    

    Nochmals vielen Dank an die freiwilligen Helfer 🙂

    #Edit: Wenn ich das ganze im Debug-Modus debugge bekomme ich keinen schwiegenden Fehler. Der kommt nur im Release-Modus. Kann man daraus vllt was schließen? (z.B. irgendeine fehlende Datei?!)

    #Edit: Das kam jetz hier schon mehrfach vor und da man sieht, dass ich davon keine ahnung hab: kann irgendjemand mal fopen, popen und was nich noch alles erklären? es scheint was mit den FILEs zutun zu haben (http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/fopen.html ) aber trotzdem kapier ich nicht so recht, wie sie funktionieren. Wenn da also jemand so gütig wäre und mir das mal erklären würde, wäre ich sehr dankbar 🙂



  • Lordakius schrieb:

    Demnach muss fopen("AllData>255.cvs", "w"); einen NULL-Pointer erzeugen, oder nicht?

    Richtig geraten.
    Und dass kommt daher, weil du ohne Verständnis fopen und _popen mischst.



  • Du hast in deinem Eröffungsthread bzw. dem in "Themen rund um die IT" auf einen Wikipediaartikel verwiesen.

    Lies den doch selber nochmal durch.

    Und nicht nur 3.3.1 sondern das danach auch.



  • Wutz schrieb:

    Lordakius schrieb:

    Demnach muss fopen("AllData>255.cvs", "w"); einen NULL-Pointer erzeugen, oder nicht?

    Richtig geraten.
    Und dass kommt daher, weil du ohne Verständnis fopen und _popen mischst.

    Kannst du mir dann eine verständliche Erklärung dieser Funktionen geben?
    Ist zwar nett, dass du mir meine Fehler zeigst (!=sarkastisch), aber gib mir doch wenigstens nen kleinen Schubs in die richtige Richtung ...

    Ich will zwar möglichst viel selber machen, aber einige Sachen verstehe ich halt nicht auf Anhieb 😞 (verzeiht mir die folgende Phrase. .. ich hasse es mit meinem Alter zu argumentieren aber) : Ich bin erst 15 und logischerweise deswegen noch nicht so viel damit gemacht.



  • Wutz schrieb:

    Lordakius schrieb:

    Demnach muss fopen("AllData>255.cvs", "w"); einen NULL-Pointer erzeugen, oder nicht?

    Richtig geraten.
    Und dass kommt daher, weil du ohne Verständnis fopen und _popen mischst.

    Vielleicht liegt es auch daran, dass > im Dateinamen nicht zulässig ist?!



  • Jau das is mir bereits aufgefallen 😃
    Muss wohl iwie reingerutscht sein ^^ (s*** happens ;))



  • 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. 😃



  • 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 xDD

    Und 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 und argv 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
    Lordakius

    PS: 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 auch 🙄

    argv ist ein Array mit Zeigern auf char .
    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 und strftime 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 dem if .
    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 ein char** . 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).


Anmelden zum Antworten