Um eine Anzahl an Zeichen "weiterspringen"



  • Ich habe hier die Ergebnis.txt Datei, in der andere Dateinamen + Zugehörigkeit stehen, so:

    Ordner: MeinOrdner
     Datei: Versuch.txt
     Datei: Versuch.c
    

    Ich will die Dateinamen auslesen, so:

    FILE *f;
    char *ptr, Zeile[200];
    
    f=fopen("Ergebnis.txt", "r");
    //Hier ggf. noch nen fseek() reingeklatscht
    while( fgets(Zeile, sizeof(Zeile), f) != NULL )
    {
        if(Zeile[1]=='D')
            ptr=strrchr(Zeile, ' ');
    }
    fclose(f);
    

    Ich suche jede Zeile nach einer "Datei" ab und suche dann rückwärts nach dem ersten Leerzeichen und zeige mit dem ptr drauf. Ausgegeben mit printf() sieht das dann so aus:

    Versuch.txt
    

    Jetzt ist es nur so, dass ich das Leerzeichen an erster Stelle nicht gebrauchen kann, das muss da weg. Meine Idee war den String einfach um eins nach links zu verschieben, etwa so:

    for(i=0; i<strlen(Zeile); i++)
        Zeile[i]=Zeile[i+1];
    

    Das ist halt nicht wirklich eine elegante Lösung. Hat da jemand vllt eine bessere Idee? 😕

    PS: Ich hab gerade kein Copy-Paste aus meinem Programm gemacht, sry für eventuelle Syntax-Fehler, dürfte hoffentlich trotzdem stimmen 😉



  • Zeile für zeile auslesen und mit sscanf splitten:

    FILE *f = fopen("asd.txt", "r");
    char line[256];
    while(fgets(line, 256, f))
    {
    	char name[128];
    	if(sscanf(line, "Datei: %s", name) < 1)
    	{
    		if(sscanf(line, "Ordner: %s", name) < 1)
    		{
    			printf("da ist was falsch");
    			break;
    		}
    		else
    			printf("Ein Ordner: %s\n", name);
    	}
    	else
    		printf("Eine Datei: %s\n", name);
    }
    fclose(f);
    

    Oder gleich den ordner mit den entsprechenden funktionen auslesen:

    #include <windows.h>
    WIN32_FIND_DATAA findData;
    HANDLE hFind = FindFirstFileA(".\\*", &findData);
    do
    {
    	if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    		printf("Oh eine Datei mit dem Namen  ");
    	else
    		printf("Na sieh mal einer an, ein ");
    	printf("%s.\n", findData.cFileName);
    }
    while(FindNextFileA(hFind, &findData) != 0);
    FindClose(hFind);
    


  • So wie ich deine Antwort verstanden habe, ändert das grundlegend aber nicht mein Problem der Formatierung. Ich hab das jetzt so gelöst, dass ich den String verschiebe. Das sind eben nur 2 Zeilen Code.

    Aber hier steht das unerwünschte Zeichen am Anfang. Wenn es mitten drin steht, geht das mit dem Verschieben zum Beispiel nicht mehr. Und da meine Frage:

    Gibt es eine Funktion, die bestimmte Zeichen in einem String einfach entfernt?



  • Nicht in C. Die C++ Standard Library hat das hier: http://en.cppreference.com/w/cpp/algorithm/remove



  • Es gibt memmov . Dies kannst du verwenden, wenn sich Ziel und Quellbereich überlappen.

    Evtl. findest du im Internet Code für eine strtrim -Funktion.

    Das Entfernen unerwünschter Zeichen aus einem String ist eine gute Grundlagenübung zum selber machen.

    Was willst du eigentlich haben Datei: oder Versuch.txt oder alles?
    Im Augenblick hast du das in Zeile. Danach musst du doch damit weiter arbeiten.
    Dann kannst du auch weitere Zeiger nehmen, die auf Texte innerhalb von Zeile verweisen.



  • Du willst doch die Datei auslesen, und das geht sehr einfach mit sscanf. Oder noch besser (nach deinem anderen Thread) geht das mit meinem zweiten Code.



  • Ich will nur das, was in der Text-Datei Ergebnis.txt drinsteht, OHNE das vorangestellte Datei:. Zeilen, die mit Ordner beginnen werden sowieso übersprungen.

    D.h. ich habe in meinem String Zeile

    Versuch.txt
    

    stehen, erstes Zeichen im String ist ein Leerzeichen. Das ist unerwünscht. 😃

    @DirkB danke, das probieren ich mal aus.



  • Ich hab dir die Lösung doch schon hingeschrieben. Ließt du meine Beiträge auch mal? 😉



  • Es ist das rumdoktern an Symptomen, die du bei richtiger Behandlung gar nicht hättest.

    Aber gut:

    if(Zeile[1]=='D')
            ptr=strrchr(Zeile+1, ' ');  // Ab D suchen
    // hier muss noch die Fehlerbehandlung hin
            ptr++;  // ptr zeigt jetzt auf das Zeichen nach dem Leerzeichen.
    


  • roflo schrieb:

    Ich hab dir die Lösung doch schon hingeschrieben. Ließt du meine Beiträge auch mal? 😉

    Der Formatstring sollte mit einem Whitespace beginnen und bei Leerzeichen im Dateinamen klappt das auch nicht.
    Man kann den Formatstring aber passend bekommen.

    char art[256], name[256], line[256];
    ...
    if(sscanf(line, " %255s %255[\n]", art, name) != 2) {  // in art dsteht dann Ordner: oder Datei:, in name der Dateiname
    


  • Das muss

    if(sscanf(line, " %255s %255[^\n]", art, name) != 2) 
    //                           ^ hier
    

    heißen


Anmelden zum Antworten