Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

31

22.10.2007, 14:07

naja.. wenn ich das per variable übergebe würde es ja auf den stack kopiert werden oder? und am heap hat man schnelleren zugriff (nat. is performance egal bei mir, aber liege ich da falsch?)

wieso muss ich nichts machen bei fstream? wozu gibts dann die funktion close()?

und dann frag ich mich, wieso bekomme ich irgendwann nen error bei file.good().. nur weil ich zb was ausgelesen hab gibt mir good() auf einmal false ..

jetzt im moment hab ich ein lustiges problem..
ich lese eine datei mit der funktion _Read_s() aus..

ich übergebe der die größe des buffers, aber ausgeben tut er mir einiges mehr.. wenn ich size - 1 gebe, dann gibt er mir genau die richtige länge (minus 1 zeichen) aus

bsp:

f._Read_s(buffer, size, size); // size is bei mir 16
ausgabe: this is one lineþþþþþ♣♣♣♣

wenn ich mach
f._Read_s(buffer, size, 15);
dann ausgabe: this is one lin

check ich nicht .. ^^
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

32

22.10.2007, 14:16

Zitat von »"$nooc"«

naja.. wenn ich das per variable übergebe würde es ja auf den stack kopiert werden oder? und am heap hat man schnelleren zugriff (nat. is performance egal bei mir, aber liege ich da falsch?)


Du liegst falsch: Es war nie die Rede von der Übergabe einer Kopie, sondern einer Referenz. Ist also egal wo im Speicher dein Streamobjekt liegt. Auf jeden Fall sind Referenzen, Zeigern in C++, wenn möglich, vorzuziehen. Und hier gibt es keinen Grund Zeiger zu verwenden!

Zitat von »"$nooc"«


wieso muss ich nichts machen bei fstream? wozu gibts dann die funktion close()?


Um die Datei zu schließen?! Schau doch in der Referenz deiner Wahl nach...

Zitat von »"$nooc"«


und dann frag ich mich, wieso bekomme ich irgendwann nen error bei file.good().. nur weil ich zb was ausgelesen hab gibt mir good() auf einmal false ..


Weil du bis zum Dateiende ließt und das EOF Flags gesetzt wird. Dann ist jede weitere Operation nicht mehr erwünscht und so liefert good() eben false... Wo ist denn da das Verständigungsproblem?

Zitat von »"$nooc"«


jetzt im moment hab ich ein lustiges problem..
ich lese eine datei mit der funktion _Read_s() aus..

ich übergebe der die größe des buffers, aber ausgeben tut er mir einiges mehr.. wenn ich size - 1 gebe, dann gibt er mir genau die richtige länge (minus 1 zeichen) aus

bsp:

f._Read_s(buffer, size, size); // size is bei mir 16
ausgabe: this is one lineþþþþþ♣♣♣♣

wenn ich mach
f._Read_s(buffer, size, 15);
dann ausgabe: this is one lin

check ich nicht .. ^^


Ja, total lustig... Dein Puffer ist eben nicht nullterminiert.
@D13_Dreinig

33

22.10.2007, 14:38

Guck dir mal den Operator! an ... dann guck dir mal an was im Destruktor von std::fstream laut Standard passieren soll/muss. Evtl. beschäftigst du dich dann auch nochmal damit, wie man eine Funktion strlen schreibt ... vllt. verstehst du dann ein wenig mehr wie C-Strings funktionieren ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

34

22.10.2007, 15:23

ok danke für die antworten.. :?

vllt. will mir noch jemand beantworten wie ich die dateien die ein verzeichnis enthält auslesen und löschen kann..

mit der funktin FindFirstFile() bekomme ich zwar ein handle auf die erste datei im verzeichnis, aber ich finde keine funktion die als parameter ein handle übernimmt und die entsprechende datei löscht (falls es sowas überhaupt gibt)..

und ja an std::remove hab ich schon gedacht, aber für die bräuchte ich sowas wie ein sting array welches mir die dateien aufzeigt, aber ich weiss leider nicht wie ich an die namen der dateien rankomme..


edit:
@ David_pb

ich weiss ja dass meine ganze fragerei nervt, aber zum beispiel so sachen wie die aussage: referenzen sind zeigen vorzuziehn...
weder weiss ich warum, noch woher ich mir solche informationen holen kann. also woher weisst DU das? und kannst du mir auch sagen wieso das so ist, und evtl. wie ich auch sowas selbst draufkomme? manche dinge kann ich mir ja aus der msdn holen, aber meistens scheitere ich weil ich gewisse dinge einfach nicht weiss ^^
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

35

22.10.2007, 17:51

Zitat von »"$nooc"«


mit der funktin FindFirstFile() bekomme ich zwar ein handle auf die erste datei im verzeichnis, aber ich finde keine funktion die als parameter ein handle übernimmt und die entsprechende datei löscht (falls es sowas überhaupt gibt)..

und ja an std::remove hab ich schon gedacht, aber für die bräuchte ich sowas wie ein sting array welches mir die dateien aufzeigt, aber ich weiss leider nicht wie ich an die namen der dateien rankomme..

Das darf doch nicht wahr sein, dass du schon bei FindFirstFile bist und dann anfängst, dass du Dateinamen brauchst...

C-/C++-Quelltext

1
2
3
4
HANDLE FindFirstFile(
  LPCTSTR lpFileName,
  LPWIN32_FIND_DATA lpFindFileData
);

C-/C++-Quelltext

1
2
3
4
5
6
// The FindNextFile function continues a file search from a previous call to the FindFirstFile or FindFirstFileEx function.


BOOL FindNextFile(
  HANDLE hFindFile,
  LPWIN32_FIND_DATA lpFindFileData
);

C-/C++-Quelltext

1
2
3
4
5
6
// The FindClose function closes a file search handle opened by the FindFirstFile, FindFirstFileEx, or FindFirstStreamW function.



BOOL FindClose(
  HANDLE hFindFile
);

C-/C++-Quelltext

1
2
3
4
// The WIN32_FIND_DATA structure describes a file that the FindFirstFile, FindFirstFileEx, or FindNextFile functions find.


typedef struct _WIN32_FIND_DATA {  DWORD dwFileAttributes;  FILETIME ftCreationTime;  FILETIME ftLastAccessTime;  FILETIME ftLastWriteTime;  DWORD nFileSizeHigh;  DWORD nFileSizeLow;  DWORD dwReserved0;  DWORD dwReserved1;  TCHAR cFileName[MAX_PATH];  TCHAR cAlternateFileName[14];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;


Das TCHAR cFileName[MAX_PATH] sollte dir irgendwie im Zusammenhang mit deinem Problem bekannt vorkommen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

36

22.10.2007, 18:01

Zitat von »"$nooc"«

edit:
@ David_pb

ich weiss ja dass meine ganze fragerei nervt, aber zum beispiel so sachen wie die aussage: referenzen sind zeigen vorzuziehn...
weder weiss ich warum, noch woher ich mir solche informationen holen kann. also woher weisst DU das? und kannst du mir auch sagen wieso das so ist, und evtl. wie ich auch sowas selbst draufkomme? manche dinge kann ich mir ja aus der msdn holen, aber meistens scheitere ich weil ich gewisse dinge einfach nicht weiss ^^


Wenn du nur ein klein bisschen mehr Eigeninitiative zeigen würdest, würdest du auch ohne permanentes fragen weiter kommen!
Das was ICH weiß habe ich mir zum Großteil angelesen, recherchiert usw. Quellen waren Bücher, diverse Suchmaschinen, Spezifikationen, Onlinehilfen... Ich hab natürlich auch in Foren nachgefragt, aber das war eher der seltene Fall.

Ich hab auch nichts gegen Leute die fragen, aber wenn jemand wegen jeder winzigen Kleinigkeit nachfragt wirds dann doch etwas extrem, oder? Viel von dem was du fragst hättest du dir selbst durch Recherche aneignen können... Ganz aktuell deine letzte Frage!

grüße
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

37

22.10.2007, 18:05

bis dahin bin ich schon gekommen

aber FileData.cFileName; hat bei mir den Wert '.'

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
    hSearch = FindFirstFile(TEXT("*.*"), &FileData);
    if(hSearch == INVALID_HANDLE_VALUE)
    { return; }

    while(hSearch != INVALID_HANDLE_VALUE)
    {
                // ...

        std::wcout<<FileData.cFileName;
                // ...

    }


das nächste is ja dass ich unicode und ansi vermische, aber davon mal abgesehn bekomme ich nicht den gesamten dateinamen zurück.. sondern nur den . den ich oben bei FindFirstFile also suchkriterium angegeben hab.

*edit:
@David_pb:
diese fehlende eigeninitiative ist ein teil meiner persönlichkeit auf die ich, zu meinem eigenen bedauern, recht häufig stoße..

aber diesmal hab ich echt versucht das irgendwie hinzubekommen, aber jedesmal steh ich vor nem neuen problem auf die ich irgendwie keine antwort finde..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

38

22.10.2007, 18:13

Wenn in dem Verzeichnis wo du suchst Dateien sind vermute ich das Problem im Bereich der

C-/C++-Quelltext

1
//...
und da kann ich wenig zu sagen ;)

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

39

22.10.2007, 19:23

ne.. die //... sollen nur zeigen dass der code noch ausgeweitet wird ..
also mehr zeilen stehn da nicht..

C-/C++-Quelltext

1
2
3
4
5
6
7
8
    hSearch = FindFirstFile(TEXT("*.*"), &FileData);
    if(hSearch == INVALID_HANDLE_VALUE)
    { return; }

    while(hSearch != INVALID_HANDLE_VALUE)
    {
        std::wcout<<FileData.cFileName;
    }


folgender code stammt aus der msdn..

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
   // Find the first file in the directory.

   hFind = FindFirstFile(DirSpec, &FindFileData);

   if (hFind == INVALID_HANDLE_VALUE) 
   {
      _tprintf (TEXT("Invalid file handle. Error is %u.\n"), 
                GetLastError());
      retval = (-1);
   } 
   else 
   {
      _tprintf (TEXT("First file name is: %s\n"), 
                FindFileData.cFileName);


hier das gesamte beispiel
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

40

22.10.2007, 19:36

Zitat von »"$nooc"«


also mehr zeilen stehn da nicht..


Irgendwie naheliegend, dass das nichts anderes als das erste Suchergebnis ausspuckt, oder?!

Versuch das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <windows.h>
#include <tchar.h>

float FormatFileSize( __int64 value, char*& unit )
{
    static const char* values[] =
    {
        "B ", "kB", "MB", "GB", "TB"
    };

    int i = 0;
    long double v = ( long double )value;

    while ( v > 1024 )
    {
        v *= 0.0009765625;
        ++i;
    }
    
    return unit = i > ( sizeof( values ) / sizeof( values[ 0 ] ) ) ? "n/a" : values[ i ], ( float )v;
}

int main()
{
    WIN32_FIND_DATA data;
    HANDLE handle;

    if ( ( handle = FindFirstFile( "*", &data ) ) != INVALID_HANDLE_VALUE )
    {
        int files = 0;
        int directories = 0;

        do
        {
            char* unit = "";
            float filesize = FormatFileSize( ( ( data.nFileSizeHigh << 32 ) | data.nFileSizeLow ), unit );
            bool isDirectory = ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) != 0;

            if ( isDirectory )
                ++directories;
            else
                ++files;

            printf( "%s %8.3f %s %s\n", isDirectory ? "<DIR>" : "     ", filesize, unit, data.cFileName );

        } while ( FindNextFile( handle, &data ) );

        printf( "%d Datei(en)\n%d Verzeichnis(se)\n", files, directories );
        FindClose( handle );
    }
    else
        printf( "Fehler %d", GetLastError() );
}
@D13_Dreinig

Werbeanzeige