PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] vector-Elemente fehlerhaft?


8-bit Brain
2004-06-22, 00:39:14
Moin Leute,

mich quält da ein Problem in C++. Zuerst der Code:
// Dateiliste erstellen
WIN32_FIND_DATA FData;

HANDLE hSearch = FindFirstFile("G:\\*.*",&FData);
BOOL MoreFiles = FALSE;

if (hSearch == INVALID_HANDLE_VALUE) return -1;

do
{
// Ist das ein Ordner ?
if (FData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{}

// Wenn nicht
else
{
// Den Dateinamen ausgeben
cout << FData.cFileName << "\n";
dateien.push_back((char*)FData.cFileName);
cout << dateien[dateien.size()-1] << "\n\n";
}

MoreFiles = FindNextFile(hSearch,&FData);
} while (MoreFiles);

FindClose(hSearch);

cout << dateien[0] << "\n";
cout << dateien[10] << "\n";
cout << dateien[20] << "\n";
cout << dateien[30] << "\n";
Der ist zugegeben nicht wirklich optimal. Ich habe ihn von einer Website (http://www.cpp-programming.de/quellcodes/viewcode.php?id=043) übernommen und leicht angepasst. Jedenfalls sollte er eigentlich funktionieren.

Folgendes: In den letzten vier Zeilen lasse ich vier verschiedene Elemente ausgeben. Jedoch wird jedes Mal der gleiche Dateiname angezeigt!

Allerdings ist es in den Zeilen
// Den Dateinamen ausgeben
cout << FData.cFileName << "\n";
dateien.push_back((char*)FData.cFileName);
cout << dateien[dateien.size()-1] << "\n\n";
so, dass tatsächlich alle Dateien gefunden werden und dass die beiden Ausgaben (einmal des Suchergebnisses und danach des vector-Elements) übereinstimmen.

Ich hoffe, jemand kann mich hier mit einer helfenden Anregung versorgen.

Es grüßt:
Gerrit

D-Swat
2004-06-22, 09:13:26
hm, wie ist denn der vector deklariert?
std::vector<char*>

Falls ja, dann liegt es daran das du den char* nicht kopierst.
Wenn du dann die nächste Datei auswählst, wird der vorherige char* ungültig.

Versuchs mal hiermit:

#include <string>
std::vector<std::string> dateien;

WIN32_FIND_DATA FData;

HANDLE hSearch = FindFirstFile("G:\*.*",&FData);
BOOL MoreFiles = FALSE;

if (hSearch == INVALID_HANDLE_VALUE) return -1;

do
{
if( !(FData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) )
{
// Den Dateinamen ausgeben
cout << FData.cFileName << "\n";
dateien.push_back( FData.cFileName );
cout << dateien[dateien.size()-1] << "\n\n";
}

} while( FindNextFile( hSearch, &FData );
FindClose(hSearch);

for( int i = 0; i < dateien.size(); ++i )
std::cout << dateien[i] << std::endl;