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