Zeichenlängen in .txt erkennen



  • Bei SO ist sogar noch eine zweite Möglichkeit mit #pragma genannt.

    #pragma warning(disable:4496)
    

    Als erste Zeile in deinem Code.



  • DirkB schrieb:

    Bei SO ist sogar noch eine zweite Möglichkeit mit #pragma genannt.

    #pragma warning(disable:4496)
    

    Als erste Zeile in deinem Code.

    Probiert und hat nicht geklappt . Von daher auch nicht in meine Beschreibung aufgenommen. (werd ich nächstes mal machen)



  • Nicht alle angemeckerten Funktion sind unsicher.
    Viele davon sind nur unsicher, wenn man sie falsch benutzt. (NULL-Zeiger, fehlenden Angabe der Arraylänge, ...)

    Die "Ersatzfunktionen" brauchen (teilweise) mehr/andere Parameter und verhalten sich auch anders, als die originalen. Eine 1:1 Umsetzung ist also schwierig.

    Die Security Features in the CRT kannst du nachlesen: http://msdn.microsoft.com/en-us/library/8ef0s5kh.aspx

    Willst du etwas von Microsoft wissen, dann kannst du im MSDN suchen, oder google nach "MSDN Stichwort"
    Willst du etwas über *ix wissen, dann schau in die man-Page, oder google nach "man Stichwort"

    Zur GUI.
    Schau mal was darüber steht: "Frameworks"
    Das sind keine Programmiersprachen. Sondern ~(lies es bei Wikipedia nach)~

    Welches Framework du nehmen kannst, hängt auch von deinen Zielen (Plattform, komplexität) ab.
    Aber nur mit C wirst du nicht weit kommen.



  • Hey 🙂
    Es geht anscheinend klar, wenn ich das Programm nicht visuell in nem Fenster darstelle.
    Nun soll allerdings nicht nur der String (also der Pfad) kopiert und angezeigt werden, sondern, der int-Wert, der die Zeichenlänge gespeichert hat. Diese Werte sollen dann in einer *.csv ausgegeben werden. (wiki=http://de.wikipedia.org/wiki/CSV_%28Dateiformat%29)

    Also soll das Programm folgendes machen:

    -Pfade auf eine textdatei schreiben (1 Zeile pro String; am besten gleich im csv-Format)
    -Pfadlänge lesen
    -Pfadlänge und dazugehörigen String in einer csv datei speichern
    -Speichern der csv datei.
    

    Das csv-Format soll genommen werden, damit man sie einfach in Excel öffnen kann und nach den Pfadlängen ordnen kann.

    Meine überlegung war:

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h>
    
    int main()
    {
    	char zeile[10000];
    	FILE *f = _popen("dir /s /b /ad C:\\", "r");
    		if (!f) return 1;
    		printf("Loading ... Please Wait!\n");
    		FILE *datei;
    		datei = fopen("AllData>255.csv", "w");
    		while (fgets(zeile, 10000, f))
    {
                strlen(zeile);
                //Speicher die Ausgabe von strlen(zeile) vor dazugehörigen Pfad-String
    
    	_pclose(f);
    	system("PAUSE");
    	return 0;
    }
    

    Soweit die Theorie 😃

    Habt ihr Verbesserungen zu meinem (halb-)pseudo-Code?
    Ist meine Methode effizient oder gibt es bessere ?
    Und wie funktioniert die Übergabe in eine *.csv? Hab mit diesem Datenformat nie
    gearbeitet. 😞

    #edit:
    ⚠ wichtig ist, dass die csv gespeichert wird !! Sie soll also nach Ende des Programms noch verfügbar sein.

    #edit:

    while (fgets(zeile, 10000, f))
    		{
    
    			int len = (strlen(zeile));
    			fprintf(datei, "%i;", len "%s", zeile); //Error:C2059 Syntaxfehler:')'
    		}
    

    So sieht nun meine while-Schleife aus. er zeigt mir rot unterschtrichen "%s" an. Aber meines Erachtens fehlt da nix. Oder bin ich einfach nur blind? (soll ja auch mal vorkommen :p)
    Außerdem fehlt mir immernoch meine Ausgabe in eine csv datei 😕

    Beste Grüße
    Lordakius



  • Lordakius schrieb:

    while (fgets(zeile, 10000, f))
    		{
    
    			int len = (strlen(zeile));
    			fprintf(datei, "%i;", len "%s", zeile); //Error:C2059 Syntaxfehler:')'
    		}
    

    So sieht nun meine while-Schleife aus. er zeigt mir rot unterschtrichen "%s" an. Aber meines Erachtens fehlt da nix.

    Die Funktion fprintf ist ja zum Glück gut dokumentiert, zum Beispiel hier:
    http://www.cplusplus.com/reference/cstdio/fprintf/
    Ein Beispielprogrämmchen ist auch dabei.



  • fprintf(datei, "%i;", len "%s", zeile); //Error:C2059 Syntaxfehler:')'
                             ^ Da hat der Compiler das Problem
    

    Der möchte da ein , oder ) haben.
    Allerdings ist das nicht die Lösung, da fprintf nur einen Formatstring erwartet. Danach kommen die Paramter

    fprintf(datei, "%i;%s;", len, zeile); // ein Formatstring
    

    Lordakius schrieb:

    Oder bin ich einfach nur blind? (soll ja auch mal vorkommen :p)

    Jepp

    Lordakius schrieb:

    Außerdem fehlt mir immernoch meine Ausgabe in eine csv datei 😕

    Äh, wozu ist denn das fprintf denn da? Du musst die Datei allerdings zum schreiben öffnen.



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


Anmelden zum Antworten