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

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

1

22.06.2006, 15:21

Multibyte Textdateien einlesen

Mein ewig leidiges Thema: Probleme mit wchar_t string (:

Ich würde gerne eine Multibyte-Character TXT Datei einlesen.
Multibyte deshalb, weil dort auch Umlaute enthalten sein dürfen.

Hab folgenden Code:


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
// WSTRING ist ein define auf std::basic_string<wchar_t>

// der Dateiname ist auch in diesem Format in den

// cUserSettings vorhanden

//

// m_iniFileString ist mein WSTRING member, wo der Text aus

// der Datei rein soll ...


    WSTRING filename = cUserSettings::GetInstance()->iniFile_filename;

    wchar_t * pFilename[sizeof( filename)];
    StringCbCopy ( pFilename,sizeof( filename), filename );
    
    
    FILE * pFile = _wfopen(pFilename,"r");
    if(pFile)
    {
        DWORD fileSize = GetFileSize(filename);
        fread(m_iniFileString,sizeof(wchar_t),fileSize,pFile );
        fclose(pFile);
        MessageBoxW(0,L"gelesen!",L"---",MB_OK);
        return TRUE;
    }


Die StringCbCopy Funktion kommt beim compilieren mit folgender tollen Fehlermeldung ...

Zitat


C:\Programme\Microsoft DirectX SDK (April 2006)\Include\strsafe.h(5595) : warning C4996: '_vsnprintf' was declared deprecated



:( :( Hilfeee Bitte.

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

3

22.06.2006, 16:18

Die Suche hat mir nicht wirklich weitergeholfen.

Hab meinen Code mal auf folgende Variante abgespeckt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
    wchar_t wstr_buffer[1024];
    FILE * pFile = _wfopen(L"2dcse.ini",L"r");
    if(pFile)
    {
        PLARGE_INTEGER fileSize;
        GetFileSizeEx(pFile, fileSize);
        fread(wstr_buffer,sizeof(wchar_t),(size_t)fileSize,pFile );
        fclose(pFile);
        MessageBoxW(0,wstr_buffer,L"---",MB_OK);
        return TRUE;
    }


soweit funktioniert das jetzt - Allerdings steht in der Message Box nur Müll.

Somit hab ich folgende Variante probiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <AtlBase.h>
#include <AtlConv.h>
/*
  ....
 */

    char cstr_Buffer[1024];
    FILE * pFile = fopen("2dcse.ini","r");
    if(pFile)
    {
        PLARGE_INTEGER fileSize;
        GetFileSizeEx(pFile, fileSize);
        fread(cstr_Buffer,sizeof(char),(size_t)fileSize,pFile );
        fclose(pFile);

        MessageBoxW(0,A2W(cstr_Buffer),L"---",MB_OK);
        return TRUE;
    }


Funktioniert aber überhaupt nicht :(

In der Doku steht:

Zitat



The syntax for using these macros is as follows:

MACRONAME( string_address )

For example:

A2W( lpa )



!?? *ratlosbin*

ext

Treue Seele

  • Private Nachricht senden

4

22.06.2006, 16:59

Vergiss die Warnung, die strsafe.h aus DirectX verwendet eine Funktion die im Visual C++ Express 2005 als deprecated markiert wurde.
Gut möglich, dass DirectX in der nächsten Version das ganze schon umgestellt haben wird und dann ist die Warnung wieder weg.

Wenn Warnungen in fremdem Quellcode auftauchen, dann kannst du da nichts machen und es ist zu überlegen die Warnung vor dem inkludieren abzuschalten und danach wieder einzuschalten.
(dxut zum beispiel macht das auch vorm inkludieren von strsafe.h)

Aus stdafx.h von dxut

C-/C++-Quelltext

1
2
3
#pragma warning( disable : 4996 ) // disable deprecated warning 

#include <strsafe.h>
#pragma warning( default : 4996 ) 

Anonymous

unregistriert

5

22.06.2006, 18:47

alexm
FINGER WEG VON fread!!! Die können nix mit Unicode anfangen! Nimm besser: CreateFile in Combo mit ReadFile!

Mit fread bombst Du Dich selber um.

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

6

22.06.2006, 20:56

So, Ratschlag natürlich befolgt:

In meiner Anwendung selbst hat mir das mal nicht hingehauen,
so hab ich schnell mal ein Konsolenprojekt gestartet.
Settings hab ich hier natürlich auch von UNICODE auf MULTIBYTE
umgestellt.

Ein Schritt in die Richtung, die ich haben will ist gelungen:
Meinen Filenamen, der in meinem Programm ja als
basic_string<wchar_t> hinterlegt ist, kann ich nach
kurzer Umkonvertierung sogar benutzen. Passt.

Der Text wird auch brav von der Textdatei eingelesen, jedoch hab ich
zwei Probleme:

1) Taugt mir das nicht, dass ich vorher 1024 Zeichen reservieren muss.
Ich weiss ja vorher nicht, ob die Datei 20 oder 20000 Zeichen
enthalten wird.

2) Kann das Dings ja wieder keine Windows-Konformen Zeichen einlesen.

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
#include <Windows.h>
#include <iostream>
using namespace std;

int main()
{

    basic_string<wchar_t> wstr_filename = L"textdatei.txt";

    LPCWSTR lpcwstr_filename = wstr_filename.c_str();

    HANDLE hSrc;

    DWORD dwRead;

    char pBuffer[1024];


    hSrc = CreateFileW(lpcwstr_filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    if (hSrc == INVALID_HANDLE_VALUE)
    {
        cout << "Fehler - Datei konnte nicht geöffnet werden\n";
        return 0;
    }

    do
    {
        ReadFile(hSrc, pBuffer, sizeof(pBuffer), &dwRead, NULL);
    } while (dwRead != 0);

    CloseHandle(hSrc);

    cout << pBuffer << endl;

    return 0;
}


Ausgabe Konsole:

Zitat


<name>
800
600
TRUE
</name>
÷
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
Drücken Sie eine beliebige Taste . . .




Vielleicht kurz zur Erklärung, worauf ich hinaus will:

[list]
*) Mein Dateiname ist wie gesagt vom Typ basic_string<wchar_t>

*) Die Textdatei wird im Windows Notepad bearbeitet und ganz normal als ANSII (Standardeinstellung) gespeichert.
Das Programm soll diese Textdatei einlesen und daraus die Werte Extrahieren um diverse Objekte zu befüllen.

*) Weiters will ich mir den eingelesenen Text zur Kontrolle am Bildschirm in einer MessageBox ausgeben lassen.
[/list]

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

8

23.06.2006, 00:15

Nicht wirklich :(

Jedenfalls bräucht ich zumindest mal eine Konvertierung von einem
C-String in einen LPCWSTR-String.

Das würd zumindest mal mein MessageBox Problem beheben.
Allerdings versteh ich das so oder so nicht so ganz - Es gibt doch
das Überladen - Warum um alles in der Welt macht es uns Microsoft dann
so schwer mit diesen blöden fixen Stringtypen bei den MessageBoxen.

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

9

23.06.2006, 00:47

Zwischenzeitlich hab ich folgende Lösung:
Ich verwende einfach eine andere MessageBox:

C-/C++-Quelltext

1
MessageBoxA(0,TEXT(pBuffer),"---",MB_OK);


***** :D freu :D *****

So, jetzt brauch ich nur mehr eine Lösung für die Buffer-Grösse ...

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

10

23.06.2006, 02:01

habs endlich!!! :!: :!:
Für alle, die ähnlich wie ich 2 Tage herumgurken mit so nem
Blödsinn:

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
inline BOOL cParser::_loadTXT_FileTo_STLString( const WSTRING &refFilename, std::string &refTargetString )
{

    // Datei öffnen

    HANDLE hFile = CreateFileW( refFilename.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if(hFile == INVALID_HANDLE_VALUE)
    {
        //FEHLER "Datei konnte nicht geöffnet werden!"

        return EXIT_FAILURE;
    }

    // Dateigröße ermitteln

    DWORD dwFileSize = GetFileSize(hFile, NULL);

    // Speicher für Buffer reservieren

    char * pTmpBuffer = new char [dwFileSize + 1];

    // Datei auslesen und mit \0 terminieren

    DWORD dwBytesRead = 0;
    ReadFile(hFile, pTmpBuffer, dwFileSize, &dwBytesRead, NULL);
    pTmpBuffer[dwBytesRead] = '\0';

    // Gelesenen Text vom Temp-Buffer in übergebenen Member-String speichern

    refTargetString = pTmpBuffer;

    // Buffer freigeben

    delete [] pTmpBuffer;

    // Datei schließen

    CloseHandle(hFile);     

    return TRUE;
}

Werbeanzeige