Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Ordner auslesen und Dateien einen Prefix voranstellen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.06.2008, 13:22 Uhr
~foo
Gast


Hey Leute,
Ich bin sehr neu was C++ anhgehtm genauer gesgat mache ich das erst ca. eine Woche.
Zum Problem:
Ich bin etwas energishc wenn es um meine Musik auf dem PC geht und stelle je nach Gattung immer einen gewissen Prefix vor dem Titel.
Da das eine sehr langwierige 'Arbeit sein kann, dacht eich mir, schreibst du dir ein Programm dafür.
Früher benutze ich PHP für diese Aktion (PHP schreibe ich seit 4 Jahren) und nun wollte ich als Übung das in etwa gleiche in C++ machen, doch irgendwie macht es mir probleme, die rename Funktion meckert "Could not find match for 'rename<char *, string>' in function main".
Hier der Code, hoffe man kann mir helfen und ggf einige Tipps/Ratschläge oder Kritik geben:

C++:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <dir.h>
#include <string>
#include <iostream>

using namespace std;

int main () {
    char hdir[10];
    string prefix;
    
    cout << "Bitte Verzeichnis angeben:\n";
    cin.getline(hdir, sizeof(hdir));
    
    cout << "Bitte einen Prefix angeben:\n";
    getline(cin, prefix);
    
    if (prefix.length() < 3) {
        perror("Prefix ist zu kurz");
        exit(0);
    }
    
    chdir("..");
    chdir(hdir);

    DIR *dp;
    dp = opendir(".");
    
    if (dp == NULL) {
        perror ("Kann Verzeichnis nicht öffnen");
        exit(0);
    }
    
    struct dirent *ep;
    struct stat status;
    
    while ((ep = readdir(dp)) != NULL) {
        stat(ep->d_name, &status);
        
        int data_type = status.st_mode & S_IFMT;
        
        if (data_type == S_IFREG) {
            string new_name = prefix + ep->d_name;
            
            if (rename(ep->d_name, new_name)) {
                cout << "hat geklappt";
            }

            cout << new_name << endl;
        }
    }
    
    closedir(dp);
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.06.2008, 18:38 Uhr
0xdeadbeef
Gott
(Operator)


Zunächst mal hat das ganze wenig mit Standard-C++ zu tun, also -> .

Davon abgesehen, ich kenne mich im DOS-API nicht besonders gut aus, aber wenn ich raten sollte,

C++:
            if (rename(ep->d_name, new_name.c_str())) {


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.06.2008, 19:00 Uhr
~foo
Gast


ops, sorry :/
Hey danke, das hat prima funktioniert, aber mir stellt sich die frage: wieso genau?
Danke schonmal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.06.2008, 19:13 Uhr
mischa
Fragender


Hallo,
naja die Antwort auf deine Frage ist recht einfach. Die Funktion rename() erwartet einen char* als zweiten Parameter und new_name ist ein Objekt der std::string Klasse. Also muss du die Methode c_str() aufrufen damit sie dir den Inhalt von new_name als einen char* zurückgibt.
--
Latein Unterricht ist die spätere Rache der Römer an den Germanen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.06.2008, 20:31 Uhr
xXx
Devil


Dann bezweifel ich ehrlich gesagt, das sie einen char* als Argument haben will. Einen const char* schon eher rename ist aber kein Teil der Dos-API, sondern C-Standard.

<stdio.h> => <cstdio>
<stdlib.h> => <cstdlib>

In wie weit du die Header brauchst ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.06.2008, 20:44 Uhr
~foo
Gast


Achso, und mit c_str verwandel ich das also in ein char, genial.
Gibt es noch weitere von diesen Methoden bzw Links wo diese beschrieben werden?
Danke schon mal


Achja: wenn man das captcha falsch angibt sieht man oben ein warning von der klasse captcha, nur als randbemerkung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: