Zeichenlängen in .txt erkennen



  • Lordakius schrieb:

    Wirklich? ...
    Gibts da ne Möglichkeit, dass innerhalb einer Funktion zu machen?
    Oder einfach eine .txt mit dem Pfad drin und die zieht man dann auf die exe?
    Die Exe nimmt dann den pfad und führt die Aufgabe auf diesen Pfad aus.

    Jetz mal ganz abstrakt formuliert. Ist eine Umsetzung möglich?
    Man kann doch einfach den Inhalt der Datei lesen und als String in cmnd einfügen.
    Das wäre doch ne "einfache" Lösung?

    Was ist daran einfacher, als direkt das gewünschte Verzeichnis auf die exe zu ziehen?



  • Belli schrieb:

    Lordakius schrieb:

    Wirklich? ...
    Gibts da ne Möglichkeit, dass innerhalb einer Funktion zu machen?
    Oder einfach eine .txt mit dem Pfad drin und die zieht man dann auf die exe?
    Die Exe nimmt dann den pfad und führt die Aufgabe auf diesen Pfad aus.

    Jetz mal ganz abstrakt formuliert. Ist eine Umsetzung möglich?
    Man kann doch einfach den Inhalt der Datei lesen und als String in cmnd einfügen.
    Das wäre doch ne "einfache" Lösung?

    Was ist daran einfacher, als direkt das gewünschte Verzeichnis auf die exe zu ziehen?

    Die Fragestellung ist ja nicht das erste Mal in diesem Thread ... langsam is ja wohl genug 😃
    Ich kann deine Meinung durchaus nachvollziehen, aber wenn der User das nicht wünscht, dann halt nicht. (ehrlich gesagt, is doch nich mein Problem, wenn er es unbedingt so will (bzw unbedingt nicht so will);))

    ➡ Ich hatte da an fgets als funktion gedacht.

    fgets(name, MAX, stdin);
    

    Das habe ich hier gefunden: http://openbook.galileocomputing.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_016.htm

    Statt stdin müsste dann der Stream aus der path-datei (dann halt keine ini ^^) stehen. Sollte es nicht auch möglich sein, den Stream sofort zu nehmen? Dann spar ich mir die Funktion fgets, oder geht es nicht ohne?

    #edit: auf selbiger Seite wurde auch das Umleiten eines Streams erklärt:
    "pfadlängenbetrachter.exe" < "path.txt"; (in meinem Beispiel)
    War das Pseudo-code oder geht das wirklich so? Was ist der Rückgabewert dabei?



  • Lordakius schrieb:

    Ich kann deine Meinung durchaus nachvollziehen, aber wenn der User das nicht wünscht, dann halt nicht. (ehrlich gesagt, is doch nich mein Problem, wenn er es unbedingt so will (bzw unbedingt nicht so will);))

    Wenn ich diesen Thread so durchgehe, gewinne ich den Eindruck, dass Dein User alle Nase lang etwas anderes möchte. Erst soll eine Datei mit Texten eingelesen werden, dann soll eine Batch-Datei verarbeitet werden, nun soll eine txt-Datei mit dem Ordnernamen auf die exe-Datei gezogen werden ...
    Vielleicht solltest Du erst mal genau ermitteln, was gemacht werden soll.
    Denn Dein Problem ist es dann ja wohl, das programmtechnisch umzusetzen ... obwohl, eigentlich auch nicht ... das wird ja wohl eher zum Problem des Forums hier ...

    Am Ende wird Dein User froh sein, überhaupt irgendetwas halbwegs funktionierendes von Dir zu bekommen.



  • Lordakius schrieb:

    Jetz mal ganz abstrakt formuliert. Ist eine Umsetzung möglich?
    Man kann doch einfach den Inhalt der Datei lesen und als String in cmnd einfügen.
    Das wäre doch ne "einfache" Lösung?

    Ja.

    Aber die sollte auch Idotensicher sein. Und das wird ein bisschen aufwendiger.
    - Leerzeichen\Tabulator und
    - Leerzeilen vor dem Pfad.
    - Leerzeiche dahinter
    - \n mit eingelesen
    - ....
    Und daran denken, dass die Natur immer bessere Idioten evolutioniert.

    Übliches vorgehen:
    Paramter von der Kommandozeile auswerten.
    Keine oder zuwenig da, dann den Nutzer fragen (fgets).
    Auch da kann man Copy&Paste machen. Ist in der Konsole aber etwas anders



  • überschreibt fgets() den String, den ich als ersten Parameter übergebe oder macht er das wie strcat?



  • Lies nach: http://www.cplusplus.com/reference/cstdio/fgets/
    oder probier es aus.

    Wenn du das überprüfst, dann z.B. mit

    printf("cmnd: <%s>\n", cmnd);
    

    und achte auf die Positionen der <>.
    Die sollten direkt vor und hinter dem Text stehen und nicht ind verschiedenen Zeilen.

    ^(Du musst ja nicht den Anfang vom String an fgets übergeben)^



  • Danke für die Seite .. hat mir geholfen ^^

    Nun habe ich allerdings immernoch das Problem, dass er mir einfach alles in die Datei schreibt (alle Pfade). Dies geschieht allerdings nur, wenn ich außerhalb des Release Ordners arbeite 😞

    Fehlt wahrscheinlich irgendeine Datei, aber ich krieg weder ne Naricht, noch ne Fehlermeldung von wegen er findet etwas nicht <.<'
    Ich weiß aber auch nich was fehlen könnte 😡



  • Da fehlt in deinem Programm die Fehlerbehandlung, ob die Ini-Datei vorhanden ist, bzw. gelesen werden konnte.
    Es fehlt evtl. noch eine Kontrollausgabe, welchen Pfad er nun genommen hat und wie das cmnd für _popen aussieht - und deren Beachtung deinerseits.

    Oder etwas ganz anderes, was dir hier keiner sagen kann, weil er nicht weiß wie dein Code gerade aussieht.
    Zudem weiß ja auch keiner richtig, wie du das Program aufrufst



  • Das Problem mit dem Pfad hab ich nun gelöst .

    Hätte noch ne Frage zu Streams:
    man nimmt jetzt zum Zugriff fopen("path.txt", "w").
    Kann man dann auch ein Zeichen lesen und dieses umwandeln (also strings lesen)
    oder funktioniert das mit Streams nicht?
    bzw. gibts da ne andere Funktion für?

    lg Lordakius



  • Lordakius schrieb:

    man nimmt jetzt zum Zugriff fopen("path.txt", "w").
    Kann man dann auch ein Zeichen lesen

    Nein.



  • w (für write) und lesen verträgt sich nicht.
    Zudem ist das ein ziemlich blöder Modus wenn man Daten aus der Datei haben will, da die Datei beim öffnen auf die Länge 0 gesetzt wird. (Die Daten sind weg)



  • ja ich kann doch nicht einfach fgets benutzen, ohne die datei offen zu haben.



  • DirkB schrieb:

    w (für write) und lesen verträgt sich nicht.
    Zudem ist das ein ziemlich blöder Modus wenn man Daten aus der Datei haben will, da die Datei beim öffnen auf die Länge 0 gesetzt wird. (Die Daten sind weg)

    Hab den mittlerweile auch auf "r".
    Idee ist, dass er erstmal ausliest.
    Alle / => ; konvertiert und dann den geänderten String wieder einsetzt.



  • Lordakius schrieb:

    ja ich kann doch nicht einfach fgets benutzen, ohne die datei offen zu haben.

    Und welchen Filedeskriptor willst du an fgets übergeben?



  • DirkB schrieb:

    Lordakius schrieb:

    ja ich kann doch nicht einfach fgets benutzen, ohne die datei offen zu haben.

    Und welchen Filedeskriptor willst du an fgets übergeben?

    Hab mich nur mal auf Wikipedia eingelesen:
    Mit Referenzwert ist sowas wie "r" "rb" und co gemeint oder die Datei, auf die ich zugreifen will?



  • Kann mal jemand über den Quellcode schauen bzw auch über die Fehlermeldung?
    Bin mir nicht ganz sicher, was die Meldung verursacht. ( ⚠ Es gibt keinen Compilerfehler. Die Fehlermeldung kommt, sobald ich das Programm starte. Bzw nach der switch Anweisung.

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h>
    
    void DeclineEnter()
    {
    	printf("Warum rufst du mich dann auf?\n");
    }
    
    void FalseEnter()
    {
    	 printf("Vorgang fehlgeschlagen ... Funktion noch nicht freigeschaltet :D\n");
    }
    
    int main()                                          
    {
    	char cmnd[1000] = "";
    		FILE *g;
    		char pathString[] = { "" };
    		g = fopen("path.txt", "r");  
    		fgets(pathString, 1000, g);
    		printf("Deine Wahl?:\n");
    		printf("[1] = Zeige Dateien + Verzeichnisse\n");
    		printf("[2] = Zeige nur Verzeichnisse\n");
    		printf("\n Bitte triff deine Wahl:\t");
    		int x = 0;
    		scanf("%i", &x);
    		switch (x)
    		{
    		case 1:{
    				  cmnd[1000] =  "dir /s /b " ;  //andere idee: bei der deklaration macht man bereits die definition als "dir /s /b" und in der switch-case dann nur noch den Zusatz  //Anzahl der Dereferenzierungen bei 'char' und 'char[11]' unterschiedlich
    				   break;
    		}
    		case 2:{
    				  cmnd[1000] = "dir /s /b /ad" ;   //Anzahl der Dereferenzierungen bei 'char' und 'char[14]' unterschiedlich
    				   break;
    		}
    		default:{
    					printf("Falsches Format. Interner Fehler\n");
    					exit(1);
    		}
    		} 
    	strcat(cmnd, PathString);												//Pfad reinsetzen. 
    	char eingabe;
    	printf("Soll die Aufgabe ausgefuehrt werden? [J]=>JA/[N]=>NEIN\n"); //Hier macht er automatisch Nein (bevor ich die Switch-Case Anweisung drinne hatte, hat die Eingabeaufforderung normal funktioniert.
    	scanf("%c", &eingabe);
    	if (eingabe == 'N' || 'n')
    	{
    		DeclineEnter();
    	}
    
    	if (eingabe == 'J' || 'j')
    	{
    		char zeile[10000];
    		FILE *f = _popen(cmnd, "r");      //Pfad.ini
    		if (!f) return 1;
    		printf("Loading ... Please Wait!\n");
    		FILE *datei;
    		datei = fopen("AllData.csv", "w");
    		while (fgets(zeile, 10000, f))
    		{
    
    			int len = (strlen(zeile));
    			//printf("%s", datei);							//Dies ist zum Testen des Inhalts von Datei
    			fprintf(datei, "%i;%s\n", len, zeile);
    		}
    		_pclose(f);
    		printf("Aufgabe abgeschlossen\n Einen Schoenen Tag noch!\n");
    		system("PAUSE");
    		return 0;
    	}
    	else FalseEnter();
    
    	system("PAUSE");
    	return 0;
    }
    

    Beim Ausführen startet cmd, die Switch-Case anweisung beginnt. Nach Eingabe einer beliebigen Zahl (alles außer 1,2 gibt wie normal die printf + exit anweisung) geht er weiter zur nächsten eingabeaufforderung und hat nein gespeichert (woher er das auch immer nimmt). in CMD sieht das dann folgendermaßen aus:

    Deine Wahl?:
    [1] = Zeige Dateien + Verzeichnisse
    [2] = Zeige nur Verzeichnisse
    
    Bitte triff deine Wahl:         1
    Soll die Aufgabe ausgefuehrt werden? [J]=>JA/[N]=>NEIN
    Warum rufst du mich dann auf?                         //=>keine eingabe möglich
    Loading ... Please Wait!                             //Das gehört zu ja !?
    Der Befehl "C:\Users\Lordakius\Desktop\Informatik\" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
    Aufgabe Abgeschlossen
     Einen Schoenen Tag noch!
    Drücken Sie eine beliebige Taste . . .
    

    Falls der Code nicht sofort klar wird einfach die Zeile zitieren, ich erklär's dann so gut ich kann 🙂



  • Wie wärs jetzt endlich mal mit dem durchlesen/arbeiten von eienm C-Buch.

    Da steht dann auch drin, wann man cmnd[1000] = "dir /s /b " ; schreiben kann und wann nicht.
    Denn so wie du es benutzt, geht es nicht. (Darum meckert auch der mit einer Warnung).

    Da steht dann auch drin, was (eingabe == 'N' || 'n') wirklich bedeutet.

    Und wenn du Glück hast, steht da auch, warum scanf("%c", &eingabe); nach einem scanf("%i", &x); nicht das Zeichen einliest.
    Da das mit dem Glück manchmal nicht klappt, zumindest die Lösung:

    scanf(" %c", &eingabe);  // Achte auf das Leerzeichen vor dem %c
    

Anmelden zum Antworten