Zeichenlängen in .txt erkennen



  • Lordakius schrieb:

    Was ist jedoch mit der .txt?
    Muss ich die nicht noch irgendwo angeben?

    Wutz schrieb:

    Der beschriebene Weg über cmd > Datei > Datei zeilenweise lesen ist möglich aber umständlich.
    Besser wäre die Verwendung der POSIX Funktion popen und dabei dann die WinApi Variante _popen, die die o.g. Sache für dich erledigt, also in etwa

    Lordakius schrieb:

    Hätte ich vielleicht erwähnen sollen: PHP lerne ich gerade erst ^^

    C kannst du ja auch nicht. Von daher spielt es dann keine Rolle womit du das programmierst.
    (Du hast nur deine C-Fähigkeiten eingeschränkt.)



  • Lordakius schrieb:

    #Edit: ich seh grad noch ne Warnung:
    Warning C4013: 'strlen' undefiniert; Annahme: extern mit Rückgabetyp int

    muss ich vllt doch string.h implementieren? fällt mir grad auf 😮

    Nein, implementieren musst du es nicht. Die Funktion gibt es schon in der C-Standardlibrary.
    Aber damit der Compiler weiß, wie die Funktion aufgerufen wird, muss er die Deklaration der Funktion kennen.
    Die steht in string.h.
    Daher reicht es aus, wenn du ein #include <string.h> am Anfang von deinem Code machst.

    Steht aber auch in dem C-Buch



  • Jo das einfügen der string.h hab ich auch gemacht,
    (bissel C kann ich ja doch ^^)

    Allerdings hab ich keine Ahnung was mit den PDB-Dateien sein soll.
    Sehen mir wie Standard Windows-befehle aus. Warum gibts also Fehler?

    #Edit:
    http://msdn.microsoft.com/de-de/library/aa292304(v=vs.71).aspx
    Heißt das, bei mir fehlen die Befehle?
    lg Lordakius



  • Das ist die leidige Unsitte bei MS mit den vorcompilierten Headerdateien.
    Die solltest du in den Projekteinstellungen abschalten.



  • Wutz schrieb:

    Die solltest du in den Projekteinstellungen abschalten.

    Wo finde ich die?

    Ich weiß gerade nicht, ob ich es nicht schon gesagt habe, aber wenn beim ausführen die cmd geöffnet wird, passiert garnichts. Es wird weder eine neue Textdatei geschrieben, noch wird eine untersucht ( zumindest krieg ich nix zurück ... das kann aber auch daran liegen, dass ich nix über 255 zeichen hab)
    Ich werde mal die grenze runtersetzen und schauen ob was passiert.

    #edit:
    Okay, habs getestet und es gibt auch was in cmd aus.
    An diesem Punkt: danke für eure Mühen 🙂
    Jetz gibts noch 2 Probleme:
    Einmal krieg ich in cmd ständig dieses "Der befehl wurde nicht gefunden" (habs ja oben schon geschrieben, auch wenn es wahrscheinlich systemseitig ist, nervt das ganz schön 😡 )
    Und bei Visual Studio beim Debug-fenster mit den PDB dateien.

    #Edit²: Das mit der cmd-Fehlermeldung hat sich geklärt ^^
    War der Überrest eines Virus ... Musste das System sowieso mal wieder neu aufsetzen 😃 😃

    Hier noch einmal der "gefixte" Code für das Problem, falls noch jemand das Problem hat:

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h>
    
    int main()
    {
    	char zeile[10000];
    	FILE *f = _popen("dir /s /b /ad c:\\Users\\Vinni\\Desktop\\", "r");
    		if (!f) return 1;
    
    	while (fgets(zeile, 10000, f))
    		if (strlen(zeile)>255)
    			printf("\nPfad laenger als 255: \"%s\"", zeile);
    
    	_pclose(f);
    	system("PAUSE");  //Optional: Damit das CMD-fenster bleibt.
    	return 0;
    }
    

    #Edit²: da hab ich doch glatt noch meine 150 Grenze reingenommen 😃

    Beste grüße
    Lordakius



  • Hey ihr Lieben 🙂

    Jetzt sagt mir Visual Studio beim Release debuggen (nennt man den Vorgang so?),
    dass die Funktion fopen unsicher sei und ich fopen_s nehmen sollte.

    Visual Studio schrieb:

    error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

    Dazu folgende Help-Seite von Windows:
    http://msdn.microsoft.com/en-us/library/ttcz0bys.aspx

    Nun könnte ich natürlich fopen_s benutzen, beim Suchen nach der Syntax ist mir folgende Seite vor die Augen gekommen:
    http://stackoverflow.com/questions/21873048/getting-an-error-fopen-this-function-or-variable-may-be-unsafe-when-complin

    Es wird gesagt, dass fopen_s nur unter MS Windows komaptibel ist . (so habe ich es zumindest verstanden :p )

    Nun meine Frage:
    Wie kann ich die Warning abschalten bzw. eine "sicherere" Funktion benutzen, die jedoch auch unter Linux zB kompatibel ist?

    Mit besten Grüßen
    Lordakius



  • Das wurde dir doch bereits vom Compiler gesagt:

    To disable deprecation, use _CRT_SECURE_NO_WARNINGS

    Und auf der von dir verlinkten MS-Seite steht es ebenfalls:

    To turn off CRT deprecation warnings, define _CRT_SECURE_NO_WARNINGS.

    Ebenso auf SO. Da ist es sogar die akzeptierte Antwort!



  • Ja das war mir bereits aufgefallen ...
    Hab ich wohl vergessen zu erwähnen, dass ich das bereits versucht habe es damals aber nicht geklappt hatte ... Gerade hats geklappt. Danke trotzdem 😃

    Nun aber zu der Frage einer "sicheren" Funktion:
    Gibts sowas für alle OS? oder hab ich da was falsch verstanden mit der inkompatibilität? (was ein Wort 😮 ).

    #Neue Aufgabe :
    Das Programm arbeitet jetzt auf Konsolenebene. Ich möchte nun aber eine GUI dafür entwickeln, habe sowas allerdings noch nie vorher gemacht. Ich hab mal bei den Foren durchgeschaut und da gibts auch ein Forum das heißt MFC (Visual Studio ++ (oder so ähnlich)) und darunter gibts ein Forum namens "andere GUI's".
    Muss ich also für eine GUI eine komplett neue Programmiersprache lernen (und das Forum wechseln 😃 :p ).

    Beste Grüße
    Lordakius



  • 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 ;))


Anmelden zum Antworten