__FILE__ mit wprintf() ausgeben
-
Hi Leute,
Ich hoffe, ihr könnt mir helfen. Ich arbeite momentan an einer Funktion für möglichst einfache, präzise Fehlermeldungen. Dabei wollte ich auch das Präprozessormakro __FILE__ benutzen. Möglichst mit der Funktion wprintf(). Jedoch kann man __FILE__ nicht direkt übergeben, da es sich dabei um einen const char[] handelt. Also dachte ich mir, konvertiere ich das ganze mal probehalber. Herausgekommen ist das hier:void WIDEN(const char* x, wchar_t *tmp) { for(int i = 0; i < sizeof(x); ++i) { tmp[i] = x[i]; } }
Jedoch konvertiert er mir irgendwie nur die ersten 4 Zeichen
. Hier noch kurz das (Test) drumherum:
int main() { wchar_t *test = new wchar_t[sizeof(__FILE__)]; char *pfad; pfad = __FILE__; WIDEN(pfad, test); wprintf(L"%i: %i, %ls\n", sizeof(__FILE__), sizeof(pfad), test); return 0; }
Die Ausgabe lautet:
D:\P 39: 4, D:\P
Danke schon mal im Vorraus(Warum wird das "versternt"???).
MfG
DargonRaider5PS.: Der vollständige Pfad lautet:
D:\Programme\AMP\FileHandling\main.cpp
-
(Warum wird das "versternt"???)
Weil du zwei 'r' darin stehen hast. Vielen Dank im Voraus.
Das ist übrigens C, bitte künftig im entsprechenden Board posten.
-
Hi Sone,
Zu meinem Rechtschreibfehler: Sorry. Und zum falschen Forum: Hatte da leider gerade nicht dran gedacht, da das "restliche" Programm(für welches ich das hier gerade versuche) in C++ geschrieben ist(würde ich behaupten). Danke für den Hinweis.
MfG
DragonRaider5
(Ooohhh, ich heiße hier ja gar nicht DragonRaider5 xD)
-
Mögliche define-Lösung:
#define AsTCHAR(x) TEXT(##x) ... const TCHAR* c = AsTCHAR(__FILE__);
-
Schade, kein Edit möglich, aber die direkte Lösung ist natürlich mit MSVC
_tprintf(TEXT("%s\n"),TEXT(__FILE__));
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89, C99 und C11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
sizeof(x) gibt dir die Größe des Zeigers zurück, der auf deiner Plattform offensichtlich Vier Bytes groß ist. Nicht die Länge des Strings. Der Trick funktioniert nur bei echten Arrays.
Wenn du etwas widen möchtest, dann mach das bei Standard-C++ mit dem ctype-Facet.
wchar_t test[sizeof(__FILE__)]; // Wieso dynamisch allokieren? Die sizeof-Ausdrücke sind alle konstante Ausdrücke. char const pfad[] = __FILE__; // Hier fehlt const-correctnes std::use_facet<std::ctype<wchar_t>>(std::locale()).widen( pfad, pfad + sizeof(pfad), test ); // Das default-konstruierte locale-Objekt ist - soweit das globale locale nicht verändert wurde - äquivalent zu dem "C"-locale
Dann gibt es da noch wstring_convert. Aber (MinGW) GCC 4.8.1 hat das nicht.
-
C++ Forumbot schrieb:
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89, C99 und C11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
lol?
Seit wann istnew wchar_t[sizeof(__FILE__)];
in C erlaubt?
-
Noch die Lösung mit codecvt:
wchar_t test[sizeof(__FILE__)]; char const pfad[] = __FILE__; std::mbstate_t mb; wchar_t* next; char const* c_next; std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(std::locale()).in( mb, pfad, pfad + sizeof(pfad), c_next, test, test + sizeof(test), next ); // ... (Fehlerbehandlung)
-
Das sizeof(x) liefert dir die Größe von x. x ist bei dir ein Zeiger und der hat auf 32-Bit Systemen i.A die Größe 4.
Du brauchst die Stringlänge von x.
Aber eigentlich möchtest du doch die Lösung haben:
#include <stdio.h> #define WIDEN2(x) L ## x #define WIDEN(x) WIDEN2(x) #define __WFILE__ WIDEN(__FILE__) wchar_t *pwsz = __WFILE__;
Quelle:http://msdn.microsoft.com/de-de/library/b0084kay%28v=vs.71%29.aspx
^nach 30 s googlen^
-
Na klar, ein L kann jeder dranhängen
-
Sone schrieb:
Na klar, ein L kann jeder dranhängen
Nö. ~wie man sieht :D~
@DragonRaider:
test und pfad werden dann auch nicht mehr gebraucht.
-
wprintf frisst mit %s nach wie vor char const * (da wird dann für jedes Zeichen mbrtowc bemüht). Wenn man wchar_t const * reinwerfen will, braucht man %ls.
__FILE__ nach wchar const * umzuwandeln, macht hier höchstens dann eine Art Sinn, wenn man
wprintf(__WFILE__); // ACHTUNG: nicht machen!
vorhat. Dann kann man aber mit Prozentzeichen im Dateinamen hart getrollt werden.