C++ Zähler im char

Blindflieger

Erfahrener Benutzer
Mitglied seit
14.01.2011
Beiträge
153
Reaktionspunkte
0
Halli hallo,

Ich möchte in C++ eine Schleife zum umbenennen von Dateien schreiben.

Dazu soll sich der Dateiname mit jedem Durchlauf ändern, da die Eingangsnamen immer Scannen mit fortlaufender Nummer lauten (Scannen0001, Scannen0002, Scannen0003 etc.) heißen.

Aber ich kann den Namen der Dateien als char nicht ändern lassen. Deshalb bitte ich euch um Hilfe.

Hier mein Prototyp:

#include /* rename example */
#include
using namespace std;
int main ()
{ int result;

int i; //Zähler in beiden Dateinamen
char oldname[] = "Scannen0001.jpg"; //Alter Name
char newname[] = "Mechanik 001.jpg"; //Neuer Name

for( i = 1; i < 99; i++ ) //Schleife zum umwandeln des Namens
{ result= rename( oldname , newname );

if ( result == 0 )
puts ( "File successfully renamed" ); //Erfolgsmeldung

else
perror( "Error renaming file" ); } //Meldung bei Scheitern
return 0; }
 
Wir sollen also deine Hausaufgaben machen und die rename() function fuer dich schreiben die hier fehlt?
1) Die rename function fehlt, wie sollen wir da den Fehler entdecken koennen?
2) Wieso char und kein string?
3) Dein C++ Buch lesen
 
Die rename Funktion fehlt nicht, sie ist in der iostream.

Dein Code funktioniert bei mir, du musst sicherstellen, dass sich die Bilder mit den alten Dateinamen (z.b. "Scannen0001.jpg") im selben Ordner wie die .exe befinden.

Habs im Debug Modus getestet und es funktioniert, also in deinem Visual Studio Projekt in dem Ordner "Debug".

Wenn du einen Release buildest, müssen sich die Bilder ebenfalls im selben Ordner, wie die .exe befinden.
 
Ob char oder string ist mir persönlich egal und keiner muss hier meine Hausaufgaben machen es ist noch nicht einmal Thema gewesen.
Dieses Programm ist nur dafür da damit ich keine 200 Dateinamen von Hand ändern muss. Danke für die Antworten.

Ich möchte aber eine Benennung der Dateien mit fortlaufender Nummer erreichen. Sodass aus Scannen0001, Mechanik0001 wird aus Scannen0002, Mechanik0002 und so weiter.
 
Willst du das unter Windows machen? Unter Linux/Mac gibts nen Haufen Batch Skripte, die das für dich machen.

edit: Ich seh auch die Frage nicht... wenn du den Code doch schon hast, warum probierst du es dann nicht einfach aus? o.O
 
Unter Windows könnte man alle markieren, F2 drücken, dann den ersten umbenennen. Den Zähler hängt er dann automatisch dran.

Falls du es aber unbedingt mit C++ machen möchtest, funktioniert es besser mit strings. Denn da kannst du sowas machen:

int i = 1;
string a = "Test";
a += i;

und dann würde in a "Test1" stehen.

In deinem Fall müsstest du:

- Den Zähler erhöhen
- die alte Zahl von oldname am Ende abschneiden
- den neuen Zähler dranhängen
 
Thoben hat folgendes geschrieben:

Die rename Funktion fehlt nicht, sie ist in der iostream.

Ich dachte mir nur bei der "#include /* rename example */" sieht das wohl schon sehr danach aus das die separat sein sollte, demnach hausaufgaben :)

Wenns nicht so ist, Entschuldigung!
 
Gut mehrere Dateien in folge mit F2 umzubenennen ist mir neu und sehr geil, Danke.
Letzten Endes will ich mich aber näher mit C++ auseinander setzen um die Sprache besser zu verstehen.

Die rename Funktion scheint jedoch nur für char Typen geeignet zu sein, wisst ihr wie ich dies umgehen kann oder noch besser wie ich einen Namen festlegen kann der zu beiden Seiten aus konstanten geschriebenen Text besteht und dazwischen einen veränderlichen double oder int hat.

Als Beispiel:

Int = 1 ;
char oldname = “Scannen000“ i “.jpg“ ;
char newname = “Mechanik“ i “.jpg“ ;

for ( i = 1; I < 99; i++ )
{ result = rename( oldname, newname )
}
 
In Anbetracht dessen, dass du wohl vorangehende Nullen hast würde ich einen Ansatz über stringstreams empfehlen.
Der sähe dann ungefähr so aus:

stringstream ss;
string extension = ".jpg"
int numberOfFiles = 99;

for(int i = 1; i
 
Vielen Dank, b0wter für die Mühe aber leider kann ich dir nicht ganz folgen. Würdest du bitte die Zeilen für mich mit Kommentaren versehen.

Zu den chars, gibt es überhaupt die Möglichkeit einen char mit einem Zähler in der Mitte zu versehen?
 
Ich kanns versuchen :]
Ein Stringstream ist eigentlich nichts wildes. Der ist eigentlich nicht viel anderes als ein String. Die Besonderheit ist, dass du mit den beiden Operatoren ">" da hinein schreiben, oder daraus lesen kannst. Das funktioniert genau wie die Ausgabe ins Terminal mit cout und dem Auslesen per cin.

stringstream ss; // erzeugt einen leeren stringstream.

wenn du da jetzt was hinein schreiben willst kannst du einfach:

ss
 
Ja, nochmals Danke b0wter das hat sehr geholfen. Nur eine Kleinigkeit noch, welche Bibliothek muss ich denn noch hinzufügen?
 
Thoben hat folgendes geschrieben:
Unter Windows könnte man alle markieren, F2 drücken, dann den ersten umbenennen. Den Zähler hängt er dann automatisch dran.

Teufel, hab' ich wieder was gelernt :praise:
 
Ja, gyroscope es ist unglaublich das einen Windows nach all den Jahren noch mal positiv überrascht.

Leider bekomme ich immer noch zwei Fehlermeldungen.

Error: ‘resault‘ was not declared in this scope

Error: cannot conver ’std::string’ to ’const char*’ for argument ’1’ to ’int rename(cons char*, const char*)’

Für mich klingt dies so als ob eine Bibliothek fehlt, diese habe ich bereits eingeführt:
#include iostream
#include fstream
#include sstream
#include string
#include iomanip
#include stdio.h
Außerdem scheinen die rename Funktion und die strings sich noch nicht zu vertragen. Kannst du mir bitte Rat geben.
 
Kommt der Fehler mit dem "resault" evtl daher, das du dich vertippt hast und result meintest?

Das zweite kannst du einfach beheben. Aus Gründen der Kompatibilität arbeiten die meisten Bibliotheken nicht mit strings, sondern immer noch mit chars. In deinem Programm werden jetzt aber strings benutzt. Die kannst du einfach umwandeln, in dem du nicht

rename(oldName, newName);

benutzt, sondern

rename(oldName.c_str(), newName.c_str());

das .c_str() liefert den string als const char* zurück.
 
Result habe ich im Programm richtig geschrieben. Die Fehlermeldung bekomme ich aber immer noch.

Error: ’result’ was not declared in this scope

Kann ich den Code eigentlich auch in einen Beitrag packen ohne dass dieser lückenhaft wird? Vielleicht ist mein Fehler dann besser sichtbar.
 
Du kannst den Code einfach bei http://pastebin.com/ posten und den Link hier reinsetzen.

edit: Fehler meinerseits. Poste am besten mal den Code :]
 
Danke für den Tipp. Den werde ich mir merken.

http://pastebin.com/BJCq9AfZ
 
Blindflieger hat folgendes geschrieben:

Danke für den Tipp. Den werde ich mir merken.


http://pastebin.com/BJCq9AfZ
Du mußt result auch an irgendeiner Stelle definieren ;)
Mein Code war nur ein Teilaussschnitt des Programs.
 
Zurück