Eine Datei kriege ich zwar geöffnet aber ich möchte einen algorithmus rein bringen und sich jedesmal den Dateinamen selber wieder zusammen bauen! Undzwar möchte ich einen Ordner durchsuchen und dort nach alle Dateien nach Lücken durch suchen und das halt in einer Schleife.
Z.B. er soll in c:\TEST\ die Dateien 31330101.txt suchen kurz öffnen,wenn er sie nciht öffnen kann dann ist die Datei ja nit da und den namen dann ausgeben und dann die Datei 31330102.txt nehmen und öffnen,etc.!!
Nur bei mir macht er die string Addition nicht um den neuen dateinamen daraus zu bilden,hat da jemand einen kleinen quellcode der sowas macht, bzw. ne Idee?? Habe leider nirgendswo was darüber gefunden!
also string addition ist rcht simpel string c=string a+ string b
bei dateinamen musst du aufpassen dass du reservierte zeichen markierst mit \
dein dateiname mit pfad ist also "c:\\TEST\\31330101.txt"
wenn du die neue nummer haben willst dann
string path="c:\\TEST\\";
string filename="bla.txt";
string filepath;
filepath=path+filename;
wie du auf die dateinamen kommst weis ich ja nicht^^
es gibt auch die möglichkeit direkt in einem ordner zu prüfen wie viele dateien mit ner bestimmten endung oder nem bestimmten teilstring enthalten sind. aber frag mich net wie das ging. www.developer.net da mal gucken.
probier mal mit dem system.io.filereader, der hat glaub ich ne prüfung ob die datei existiert.
Also so ind er Richtung habe ichd as versucht,es sei dabei gesagt das cih das mit der IDE Turbo C++ Mache! Also rein Editor!
Und da versemmelt er mir das irgendwie!
Also wie gesagt die Endung bleibt gleich lediglich die letzten 4 Ziffern ändern sich die ersten zwei der 4 Ziffern stehen für eine Zahl die um 1 erhöht wird wenn die letzten 2 Ziffern der 4 Ziffern bei 30 angekommen sind!
Und nun will ich mit dieser Schleife ein kleines Progrämmchen tipseln was mit die Dateien rausschreibt die vom Thema abweichen!
Und lediglich das String zusammen basteln in einer Schleife will nicht gelingen!
Der Rest steht ja schon soweit!!
Ich werd emir das morgen auf der Arbeit nochaml genau anschauen und dann kann ich mal einen kleinen Auszug posten!
Du arbeitest mit Ziffern. kann es sein, dass du bei dem zusammenfügen des Strings die Integer nicht in einen String gewandelt hast? Naja, der Compiler sollte das eigentlich merken^^.
Kannst du den Code posten also nur die Schleife wo du die Strings zusammenfügst? vielleicht sieht man schon was...
edit: ich hab grad mal nachgeschaut und für c++(MSVS 6) auch nur die Lösung mit dem öffnen und nachträglichem Auswerten gefunden. Beim Visual Studio 2003 gibts da schon mehr Möglichkeiten (Stichwort file.exists )
char store,monat,day;
//store='33';
//monat='02';
day='03';
char Feld[80]="c:\\"+"3302"+"08"+"02"+".005"; // Probleme mit dem zusammenbau eines neuen Dateinamen
char *datei="zeit"+".txt"; // Dasselbe Problem
FILE *fpfp=fopen(datei,"r");
zeichen=fgetc(fpfp);
day++;
if(zeichen==EOF)
{
return(0);
}
else
return(1);
test=getch();
Warum machst du nicht einfach nen String, den du mit + wie oben beschrieben zusammenfügst.
also string test = "hallo"+"du";
Danach kopierst du den String mittels strcpy(feld, test.c_str())
Damit denk ich haste die wenigsten probleme. Bei dir funzzt das nicht so, weil du ja mit dem Array nen Zeiger definierst den du nacheinander mit deinen Buchstaben belegst. Den +-Operator kennt er dabei nicht.
char *datei="zeit"+".txt";
Das wird noch verherender- Du legst damit nen Zeiger auf char an und dahinein speicherst du irgendwas. Wenn Du Glück hast macht ers nicht wenn doch dann schreibt er dir die Zeit irgendwo in den Arbeitsspeicher (Zeiger sind wenn du Glück hast nach der deklaration auf NULL wenn nicht dann haben sie irgendne Adresse drinnen stehen)
Les dir am besten nochmal alles zu Zeigern und arrays durch.
-den char - Zeiger definierst du bspw. mit
char* datei= new char(); // Speicherplatz reservieren nicht vergessen
--> Den Plus-Operator kennt er dabei logischerweise auch wieder nicht.
Zum Rest des Programms kann ich wenig sage, da ich nicht so richtig weiss was du machen willst.
Was soll z.B day='03' oder day++ ???
Obiges Codebeispiel aus einem Projekt von mir sucht in dem Verzeichnis /pics nach der Datei filexxx.jpg wo xxx am größten ist. Beim neuen Dateinamen ist die Zahl dann eins höher.
write_jpeg_file() ist eine Funktion die eine JPEG erstellt, kannst du natürlich ignorieren.
sprintf macht dasselbe wie printf, nur dass es in einen string schreibt und nicht auf die Ausgabe. sprintf und printf sind zwar eigentlich aus C, funktionieren aber in C++ genauso.
edit: Ich habe gerade versucht deinen Code entsprechend umzuschreiben, aber irgendwie ist mir das nicht ganz gelungen.
Diese beiden Zeilen:
@ Kernel String kennt der ja nicht! Arbeite wie schon gesagt mit dem Turbo C++ komplett Editor basiert und string mag er nciht,und das was mit dem Pointer da siehst war der letzte Verzweifelte Versuch und ein überbleibsel!
@Zarniwoop : Die Sprintf funktion sieht nicht schlecht aus! warum das %03d in dem Filenamen??
die 2 Zeilen die du ansprichst war der Test:
char Feld[80]="c:\\"+"3302"+"08"+"02"+".005";
soll durch z.B.
char Feld[80]="c:\\"+"3302"+Monat+Tag+".005";
ersetzt werden,da ich aber erstmal testen wollte ob es generell klappt habe ich es so probiert!! danke für die schnelle Hilfe!!
Japp hast recht (hab mich falsch ausgedrückt), aber er benutzt ja C++ und da sollte es String geben (mit der eingebundenen Header).
Ist sprintf im C++ nicht sogar depricated?
Hmm naja ka- meld dich mal, wenn Du das Problem lösen konntest
Hallo bin nun aus dem Urlaub wieder back!
Also ich werde morgen direkt mal schauen,das sprintf hat mcih neugierig gemacht *ggg*
Du hast ja da %03d drin stehen,ich denke mal das das ein Platzhalter ist,nun ich habe noch nie mit Platzhaltern gearbeitet und ich möchte gerne aus 3 Teilen diesen "Filenamen" erstellen also könnte einer von euch mir ma erklären wie genua dieser Platzhalter aufgebaut ist udn woher er weiß das er gerade diesesen String und nciht einen anderne nehmen soll,also bei mehreren Strings!
Dieses "%03d" ist ein Formatspezifizierer(oder so ähnlich). Die Funkton kann beleibig viele Parameter aufnehmen, wobei der erste der buffer in den geschrieben werden soll und der zweite der Formatstring sein muss. Der Rest sind Variablen, die man verwenden möchte. Die mit %-Zeichen eingeleiteten Platzhalter zeigen der Funktion an, an welcher Stelle eine Variable eines bestimmten Typs soll. Unterschiedliche Zeichen bedeuten Unterschiedliches.
%c steht z.b für einen char-Buffer(string), %d für einen int-Wert oder %f für einen float-Wert. Eine Auflistung findet sich hier. Bei der Frage, welche Variable zu welchem Formatspezifikator gehört geht es einfach nach der Reihenfolge. Ein Beispiel:
(printf ist analog zu sprintf, mit dem Unterschied, dass printf eine Bildschrimausgabe macht.)
(ungetestet)
Code:
char stringbuffer1[] = "Hallo";
char stringbuffer2[] = "ich bin doof";
for(int i = 1; i < 10;i++) {
printf( "%c, %c.\nDas sage ich jetzt zum %d. Mal\n\n", stringbuffer1, stringbuffer2, i);
}
Sollte(wenn ich nicht irgendwo was falschgemacht habe) etwa das ausgeben:
Hallo, ich bin doof.
Das sage ich jezt zum 1. Mal
Hallo, ich bin doof.
Das sage ich jezt zum 2. Mal
Hallo, ich bin doof.
Das sage ich jezt zum 3. Mal
...
Ja, ich weiß, sehr sinnvoll sind meine Sätze nicht, aber das war auch nicht der Zweck der Übung...
Man kann noch verschiedene andere Sachen machen, das %03d ist z.B. eine Integer Variable, die links mit Nullen auf drei Stellen aufgefüllt wird. Hab ich verwendet, damit dann Filenamen wie file004.jpg oder file034.jpg oder file124.jpg herauskommen.
AH! Okay jetzt habe ich das verstanden,DICKES THX an Zarniwoop,werde mich dann heute oder Morgen mal dran begeben werde mich dann nochmal melden und einen Bericht liefern ob es geklappt hat!
Aber schonmal im vorraus DANKE für die schnelle Hilfe
Moin so habe es mal mit sprintf ausprobiert klappt einfach nur Klasse!! Vielen Dank!
Jetzt noch ne Frage am Rande gibt es bei C eine Funktion die die Schaltjahr Rechnung machen kann und mir direkt sagen ist das Jahr ein Schaltjahr oder nicht??
Achso und wenn ich einen File überprüfe und dieser ist nicht da,wie kann ich den dann erstellen?
So also das mit dem Schaltjahr und dem File erstellen habe ich nun schon hinter mich gebracht genauso wie das Wochentag bestimmen! Nun fehlt mir noch ein Algorithmus wie ich in eine geöffnete Datei ans Ende springe also mit ner Funktion am besten. Und wie kann ich einen String SO weg schrieben das der dort ein Enter hintersetzt das der den nexten Text in eine neue Zeile schreibt?
Wie kann ich denn wenn ich zum Beispiel die ersten zwei Zeichen überprüft habe eine Zeile weiter springen?
Das mit kopieren,kann ich das auch mit dem System Befehl machen? Und wie kann ich da einen String zusammenbasteln um das mit dem kopieren wieder selber zusammen bauen!
Geändert von Littlefreddy (20.03.2006 um 07:53 Uhr)