Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Dateinamen in Array speichern

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 < [ 2 ]
000
15.06.2003, 19:54 Uhr
~peterpeter
Gast


Hallo,
ich habe folgendes gefunden um dateinamen eines ordners zu finden. Kann mir jetzt gemand sagen wie ich das ganze in ein Array bekomme?


C++:
#include <windows.h>
#include <iostream.h>

int main()
{

    HANDLE fHandle;
    WIN32_FIND_DATA wfd;
    fHandle=FindFirstFile("c:\\*",&wfd);
    FindNextFile(fHandle,&wfd);
    while (FindNextFile(fHandle,&wfd))
    {
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {}
        else
        {
            cout << wfd.cFileName << endl;
        }
    }
    FindClose(fHandle);


    return 0;
}


Dieser Post wurde am 16.06.2003 um 08:32 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.06.2003, 19:58 Uhr
~0xdeadbeef
Gast


Ich würde an deiner Stelle einen vector nehmen:

C++:
#include <windows.h>
#include <iostream> //neuer Standard
#include <vector>

using namespace std; //sonst musst du cout usw. eigentlich über std::cout ansprechen

int main()
{
    vector<char*> vDateinamen;
    HANDLE fHandle;
    WIN32_FIND_DATA wfd;
    fHandle=FindFirstFile("c:\\*",&wfd);
    FindNextFile(fHandle,&wfd);
    while (FindNextFile(fHandle,&wfd))
    {
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {}
        else
        {
            vDateinamen.push_back(wfd.cFileName);
        }
    }
    FindClose(fHandle);

    return 0;
}


wofür schreibt man denn C++?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.06.2003, 20:10 Uhr
peterpeter



Hm... sieht ja schon ganz super aus!
Aber ich muss jetzt mal noch dabei sagen das ich nicht gerade der C++ Crack bin. Und jetzt stellt sich mir die Frage wie ich den vector auslesen kann..

wenn ich das wüsste wäre mir schon sehr geholfen!!

tHx ciao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.06.2003, 20:50 Uhr
~0xdeadbeef
Gast


Da gibts viele Möglichkeiten. Schau zum Beispiel mal das hier an:

C++:
#include <vector>        //für den vector
#include <algorithm>     //für copy
#include <ext/numeric>   //für iota
#include <iterator>      //für die iteratoren
#include <iostream>      //für cin und cout

using namespace std;

int main(int argc, char *argv[]) {
  vector<int> v(10);

  /* iota füllt den Vektor mit aufsteigenden Zahlen. In diesem Fall
   * 1-10, weil ich 1 als Startwert gegeben habe und der Vektor
   * oben mit 10 Stellen initialisiert wurde
   */

  iota(v.begin(), v.end(), 1);

  /* Möglichkeit 1: operator [] */
  for(int i = 0; i < v.size(); ++i)
    cout << v[i] << " ";
  cout << endl;

  /* Möglichkeit 2: Iteratoren */
  for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
    cout << *i << " ";
  cout << endl;

  /* Möglichkeit 3: Standard-Algorithmen */
  copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
  cout << endl;

  return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.06.2003, 20:52 Uhr
virtual
Sexiest Bit alive
(Operator)


Also die Funktionen Find*File sind nicht ANSI, aber wenn sie das tun was ich vermute, nämlich einfach eine Structure namens wfd füllen, dann ist der obige Code ziemlicher Schrott und du erhälst eine Liste von lauter gleichen Namen.
Ersetze daher da

C++:
vector<char*> vDateinamen;


Durch

C++:
vector<string> vDateinamen;


(#include <string> auch noch einfügen).

Dann hast Du verschiedene möglichkeiten, mit dem Vector zu arbeiten. Die für dich zunächst wichtigen Dinge sind:

C++:
vDateinamen.size()


Gibt die Anzahl der Elemente im Vektor zurück,

C++:
vDateinamen[i]


Erlaubt Dir lesend und schreibend zugriff auf das i-te Element im Vektor, wobei ab 0 gezählt wird. Ergo gibt dir Folgende Schleife alle Namen aus:

C++:
for(int i=0; i<vDateinamen.size(); ++i)
{
    cout<<vDateinamen[i] <<endl;
}


Später wirst Du dich danach sehnen,. daß du das irgendwie automatischer haben willst, dann schreibst Du:

C++:
copy(vDateinamen.begin(), vDateinamen.end(), ostream_iterator<string>(cout, "\n"));


Vielleicht auch nicht.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.06.2003, 21:00 Uhr
~0xdeadbeef
Gast


Ha, da war ich schneller als du. Das mit dem String ist wohl war, allerdings empfiehlt sich bei Windows-Programmierung dann die Klasse CString - Microsoft hat sich da ein ziemlich komisches Konzept ausgedacht, was die Behandlung von Unicode angeht.

Frage dazu - verhält sich der Vektor wie ne map, also ist so Code wie das hier:

C++:
vector<int> v(5);
v[10] = 12;


legal?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.06.2003, 21:06 Uhr
peterpeter




Zitat:
peterpeter postete
Hm... sieht ja schon ganz super aus!
Aber ich muss jetzt mal noch dabei sagen das ich nicht gerade der C++ Crack bin. Und jetzt stellt sich mir die Frage wie ich den vector auslesen kann..

wenn ich das wüsste wäre mir schon sehr geholfen!!

tHx ciao



also die "#include <ext/numeric>" kann er nicht finden!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.06.2003, 21:11 Uhr
peterpeter



also ihrgentwie klappt das nicht so ganz.

am besten erkläre ich erstmal was ich genau damit machen will.

Also ich habe ein Wechsellaufwerk am PC. Dort ist ein Ordner mit Dateien deren name unbestimmt ist. Diese Dateien will ich jetzt alle auslesen und dannach mit copy() auf meine festplatte speichern. Dabei soll aber jeder Dateiname noch geändert werden.
Ausserdem muss noch ein verzeichniss erstellt werden.

Im Moment habe ich das ganze mit BATCH befehlen über system(); gemacht. Aber da gibt es einige sachen die mir nicht gefallen. 1. es öffnet sich eine console beim kopieren. 2. ich kann die dateinamen nicht umbennnen... weil ich mit *.* kopiere!!

vielleicht gibt et jetzt besser lösngsvorschläge!!


tHx
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.06.2003, 21:55 Uhr
peterpeter



So ich hab mal bisschen wat gemacht... un et funktioniert jetzt auch... allerdings hab ich jetzt 4 warnungen mit dennen ich nix anfangnen kann!!



C++:

#include <windows.h>
#include <iostream> //neuer Standard
#include <vector>
#include <string>
#include <algorithm>

using namespace std; //sonst musst du cout usw. eigentlich über std::cout ansprechen

int main()
{
    vector<string> vDateinamen;
    HANDLE fHandle;
    WIN32_FIND_DATA wfd;
    fHandle=FindFirstFile("c:\\*",&wfd);
    FindNextFile(fHandle,&wfd);
    while (FindNextFile(fHandle,&wfd))
    {
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {}
        else
        {
            vDateinamen.push_back(wfd.cFileName);
        }
    }
    FindClose(fHandle);


//    for(int i=0; i < vDateinamen.size(); i++)
//    {
//        cout << vDateinamen[i] << endl;
//    }


    copy(vDateinamen.begin(), vDateinamen.end(), ostream_iterator<string>(cout, "\n"));

    return 0;
}




--------------------Konfiguration: FindFirstFile - Win32 Debug--------------------
Kompilierung läuft...
FindFirstFile.cpp
DProgrammierung\C++\Projekte\FindFirstFile\FindFirstFile.cpp(37) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_traits<char>,std::allocator<char
> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen reduziert
DProgrammierung\C++\Projekte\FindFirstFile\FindFirstFile.cpp(37) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,st
d::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen reduziert
cprogramme\microsoft visual studio\vc98\include\vector(39) : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::
vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen verkürzt
cprogramme\microsoft visual studio\vc98\include\vector(60) : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::
~vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen verkürzt
Linker-Vorgang läuft...

FindFirstFile.exe - 0 Fehler, 4 Warnung(en)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.06.2003, 23:38 Uhr
~0xdeadbeef
Gast


Die Warnungen sind nicht weiter kritisch. Du kompilierst mit Debug-Symbolen (was zum debuggen auch ziemlich sinnvoll ist), und du benutzt templates, bei denen die Debug-Symbole ziemlich lang werden - wie du ja siehst. Der Visual C++-Compiler (den du scheinbar benutzt) verkürzt die dann auf 255 Zeichen, was nicht immer ausreicht. Deswegen sch(m)eisst er ne Warnung raus.

Auf die Lauffähigkeit des Codes hat das aber keinen Einfluß, und der Code wird dadurch auch nicht unsauber.

Dieser Post wurde am 16.06.2003 um 08:32 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


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: