-
October 9th, 2013, 12:14 PM
#1
ussing if or Switch with LPCWSTR
Hello,
i am trying to read an ini file and usse an if or switch to take action.
i have this in ini.h file
LPCWSTR ini_read_string(LPCWSTR _ini_File_Name, LPCWSTR _ini_Section_Name, LPCWSTR _ini_Key_Name, LPCWSTR _ini_Default )
{
TCHAR _Rvalue[5];
GetPrivateProfileStringW(_ini_Section_Name,_ini_Key_Name,_ini_Default,_Rvalue,5,_ini_File_Name);
return (LPCWSTR) _Rvalue;
}
now when i do this:
OverLay[0]=ini_read_string(map_file_ini,_T("Section"),_T("Key"),_T("NULL"));
if(OverLay[0]==_T("NULL"))MessageBox(NULL,_T("File or kay not exists"),_T("Error"),MB_ICONEXCLAMATION|MB_OK);
but the key dos not exists, so it will return NULL, but yet i am not getting the message box (LPCWSTR)
i also dit try
if(OverLay[0]=="NULL"), if(OverLay[0]==L"NULL"),if(OverLay[0]== (LPCWSTR)"NULL"), if(OverLay[0]== (LPCWSTR)L"NULL"), if(OverLay[0]== (LPCWSTR)_T("NULL"))
but it never dit work.
to be sure of the returning value i also dit this
MessageBox(NULL,ini_read_string(map_file_ini,_T("Section"),_T("kay"),_T("NULL")),(LPCWSTR)L"Error!",MB_ICONEXCLAMATION|MB_OK);
and ther it is, an message box with the text "NULL"
so why is the if(OverLay[0]==xxx) not working?
and i also need a big list so an working switch(OverLay[0]) will be nice as well (else i need to do if/ else if many times)
Thanks for reading
-
October 9th, 2013, 12:57 PM
#2
Re: ussing if or Switch with LPCWSTR
Please use code tags, indent properly, turn off the goofy colors and write each statement on a separate line and use proper indentation.
It would help if you showed the definition of Overlay.
-
October 9th, 2013, 01:30 PM
#3
Re: ussing if or Switch with LPCWSTR
Hope this is more easy to read.
i am trying to read an ini file and usse an if or switch to take action.
i have this in ini.h file
Code:
LPCWSTR ini_read_string(LPCWSTR _ini_File_Name, LPCWSTR _ini_Section_Name, LPCWSTR _ini_Key_Name, LPCWSTR _ini_Default )
{
TCHAR _Rvalue[5];
GetPrivateProfileStringW(_ini_Section_Name,_ini_Key_Name,_ini_Default,_Rvalue,5,_ini_File_Name);
return (LPCWSTR) _Rvalue;
}
when i usse the folowing code
Code:
LPCWSTR OverLay[40] /array
OverLay[0] = ini_read_string(map_file_ini,_T("Section"),_T("Key"),_T("NULL"));
if ( OverLay[0] == _T( "NULL" )) MessageBox(NULL,_T("File or kay not exists"),_T("Error"),MB_ICONEXCLAMATION|MB_OK);
but the key dos not exists, so it will return NULL, but yet i am not getting the message box (LPCWSTR)
i also dit try this:
Code:
if(OverLay[0]== "NULL")
if(OverLay[0]== L"NULL")
if(OverLay[0]== (LPCWSTR) "NULL" )
if(OverLay[0]== (LPCWSTR) L"NULL" )
if(OverLay[0]== (LPCWSTR)_T("NULL"))
but not 1 seems to work
to test the returning value of ini_read_string(); i have done this:
Code:
MessageBox(NULL,
ini_read_string(map_file_ini,_T("Section"),_T("kay"),_T("NULL"))
,(LPCWSTR)L"Error!",MB_ICONEXCLAMATION|MB_OK);
and ther it is an Error message that say NULL
so i wonder, why isent the "if ( OverLay[0]== xxx )" working
i also need a switch(OverLay[0])
has anybodey an idea of wat i am missing, or wat i do so wrong?
-
October 9th, 2013, 01:38 PM
#4
Re: ussing if or Switch with LPCWSTR
I should have seen it before. You should be comparing to NULL, not "NULL". With the quotes, it's a string literal.
-
October 9th, 2013, 01:39 PM
#5
Re: ussing if or Switch with LPCWSTR
In your ini_read_string, you are returning a pointer to a memory location that is invalid once the function returns as _Rvalue is only valid during the function.
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
October 9th, 2013, 01:58 PM
#6
Re: ussing if or Switch with LPCWSTR
Originally Posted by GCDEF
I should have seen it before. You should be comparing to NULL, not "NULL". With the quotes, it's a string literal.
i know that part but when you read an key from an ini file it returns an default value if the key not exists, i ussed _T("NULL") to return the string "NULL" if the kay not exists
ini_read_string(LPCWSTR _ini_File_Name, LPCWSTR _ini_Section_Name, LPCWSTR _ini_Key_Name, LPCWSTR _ini_Default )
but i also ussed something else like "TEST" or reading an existing kay
ussing this i always get the default value, or true value if file / key exists
Code:
MessageBox(NULL,
ini_read_string(map_file_ini,_T("Section"),_T("kay"),_T("TEST"))
,(LPCWSTR)L"Error!",MB_ICONEXCLAMATION|MB_OK);
but this code never works
Code:
LPCWSTR OverLay[40] /array
OverLay[0] = ini_read_string(map_file_ini,_T("Section"),_T("Key"),_T("TEST"));
if ( OverLay[0] == _T( "TEST" )) MessageBox(NULL,_T("File or kay not exists"),_T("Error"),MB_ICONEXCLAMATION|MB_OK);
In your ini_read_string, you are returning a pointer to a memory location that is invalid once the function returns as _Rvalue is only valid during the function.
if not mistaking its now savet to the variable LPCWSTR OverLay[40];
Code:
OverLay[0] = ini_read_string(map_file_ini,_T("Section"),_T("Key"),_T("NULL"));
if ( OverLay[0] == _T( "NULL" )) MessageBox(NULL,_T("File or kay not exists"),_T("Error"),MB_ICONEXCLAMATION|MB_OK);
-
October 9th, 2013, 02:03 PM
#7
Re: ussing if or Switch with LPCWSTR
Originally Posted by MR.Hotdog
but this code never works
Code:
LPCWSTR OverLay[40] /array
OverLay[0] = ini_read_string(map_file_ini,_T("Section"),_T("Key"),_T("TEST"));
That code "never works" because you were told already that ini_read_string returns garbage.
Code:
LPCWSTR ini_read_string(LPCWSTR _ini_File_Name, LPCWSTR _ini_Section_Name, LPCWSTR _ini_Key_Name, LPCWSTR _ini_Default )
{
TCHAR _Rvalue[5];
//...
return (LPCWSTR) _Rvalue;
}
It is undefined behaviour to return a pointer or reference to a local variable. That is basic C++ rules, but you violated them.
Regards,
Paul McKenzie
-
October 9th, 2013, 02:13 PM
#8
Re: ussing if or Switch with LPCWSTR
Originally Posted by MR.Hotdog
i know that part but when you read an key from an ini file it returns an default value if the key not exists, i ussed _T("NULL") to return the string "NULL" if the kay not exists
ini_read_string(LPCWSTR _ini_File_Name, LPCWSTR _ini_Section_Name, LPCWSTR _ini_Key_Name, LPCWSTR _ini_Default )
but i also ussed something else like "TEST" or reading an existing kay
ussing this i always get the default value, or true value if file / key exists
Code:
MessageBox(NULL,
ini_read_string(map_file_ini,_T("Section"),_T("kay"),_T("TEST"))
,(LPCWSTR)L"Error!",MB_ICONEXCLAMATION|MB_OK);
but this code never works
Code:
LPCWSTR OverLay[40] /array
OverLay[0] = ini_read_string(map_file_ini,_T("Section"),_T("Key"),_T("TEST"));
if ( OverLay[0] == _T( "TEST" )) MessageBox(NULL,_T("File or kay not exists"),_T("Error"),MB_ICONEXCLAMATION|MB_OK);
if not mistaking its now savet to the variable LPCWSTR OverLay[40];
Code:
OverLay[0] = ini_read_string(map_file_ini,_T("Section"),_T("Key"),_T("NULL"));
if ( OverLay[0] == _T( "NULL" )) MessageBox(NULL,_T("File or kay not exists"),_T("Error"),MB_ICONEXCLAMATION|MB_OK);
Your code is a little odd, but if that's the case you're comparing Overlay[0], which is a pointer, to "NULL" which is also a pointer. They can never be equal. Use strcmp to compare strings.
-
October 10th, 2013, 11:30 AM
#9
Re: ussing if or Switch with LPCWSTR
Thanks for helping so far, i still havent find a sulution, but yet i have learnd a loth from you gay's
i dit learn C a while ago for µC Processor projects, but i never need oter variables then int in those µC projects.
so i am new in both windows as strings,
pahaps somebody may be able te help me out if i drop the whole code and say:
if to usse if function on the returning value of GetPrivateProfileStringW
Code:
#include "stdafx.h"
#include <iostream>
#include<Windows.h>
wchar_t ini_index[5];
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "INI FILE READING TEST PROGRAM" << std::endl << std::endl;
GetPrivateProfileStringW(_T("Test"),_T("Key"),_T("NE"),ini_index,5,_T("c:\\test.ini"));
if(return value == "NE") std::cout << "File\Key not Exists";
else if(return value == "ON") std::cout << "I left my tv on";
else if(return value == "OFF")std::cout<< "TV is boring"
else if(return value == "qefqd")std::cout<<"My cat is walking over my keyboard";
system("pause");
return 0;
}
an switch can be ussefull to, if it can be ussd with strings
-
October 10th, 2013, 11:53 AM
#10
Re: ussing if or Switch with LPCWSTR
What's return value?
Read and understand what I said in my previous post. You can't test null terminated strings for equality using ==. You need to use some kind of string class or use one of the sting comparison functions such as strcmp. Also, qefqd won't fit in a 5 byte char array. You need to leave room for the null terminator.
And no, switch doesn't work with strings. MSDN says "The expression must be of an integral type or of a class type for which there is an unambiguous conversion to integral type"
-
October 10th, 2013, 01:29 PM
#11
Re: ussing if or Switch with LPCWSTR
Originally Posted by GCDEF
What's return value?
somehow a bit of text wend missing (removed by mistake)
i dit usse the:
if(std::strcmp((char*)ini_index,"NE")) but dident work so thats why i post my last post.
but thanks for showing me the strcmp,
i found an nice website witch generate vonvertion scripts so now it works
http://www.convertdatatypes.com/Conv...CPlusPlus.html
Code:
#include "stdafx.h"
#include <iostream>
#include<Windows.h>
wchar_t ini_index[6];
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "INI FILE READING TEST PROGRAM" << std::endl << std::endl;
GetPrivateProfileStringW(_T("Test"),_T("Key"),_T("NE"),ini_index,5,_T("c:\\test.ini"));
wchar_t* vIn = ini_index;
char * vOut = new char[wcslen(vIn)+1];
wcstombs_s(NULL,vOut,wcslen(vIn)+1,vIn,wcslen(vIn)+1);
if(std::strcmp(vOut,"NE")==0) std::cout << "File\Key not Exists";
else if(std::strcmp(vOut,"ON")==0) std::cout << "I left my tv on";
else if(std::strcmp(vOut,"OFF")==0)std::cout<< "TV is boring"
else if(std::strcmp(vOut,"qefqd")==0)std::cout<<"My cat is walking over my keyboard";
system("pause");
return 0;
somehow std::strcmp(vOut,"NE") is true when vOut is not "NE" but ==0 was an quikfix to get it working
but thanks a loth, i dit learn a loth from all of you
In your ini_read_string, you are returning a pointer to a memory location that is invalid once the function returns as _Rvalue is only valid during the function.
That code "never works" because you were told already that ini_read_string returns garbage.
Also, qefqd won't fit in a 5 byte char array. You need to leave room for the null terminator.
ou're comparing Overlay[0], which is a pointer, to "NULL" which is also a pointer. They can never be equal. Use strcmp to compare strings.
-
October 10th, 2013, 02:09 PM
#12
Re: ussing if or Switch with LPCWSTR
Originally Posted by MR.Hotdog
Thanks for helping so far, i still havent find a sulution, but yet i have learnd a loth from you gay's
i dit learn C a while ago for µC Processor projects, but i never need oter variables then int in those µC projects.
so i am new in both windows as strings,
pahaps somebody may be able te help me out if i drop the whole code and say:
if to usse if function on the returning value of GetPrivateProfileStringW
Code:
#include "stdafx.h"
#include <iostream>
#include<Windows.h>
wchar_t ini_index[5];
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "INI FILE READING TEST PROGRAM" << std::endl << std::endl;
GetPrivateProfileStringW(_T("Test"),_T("Key"),_T("NE"),ini_index,5,_T("c:\\test.ini"));
if(return value == "NE") std::cout << "File\Key not Exists";
else if(return value == "ON") std::cout << "I left my tv on";
else if(return value == "OFF")std::cout<< "TV is boring"
else if(return value == "qefqd")std::cout<<"My cat is walking over my keyboard";
system("pause");
return 0;
}
an switch can be ussefull to, if it can be ussd with strings
In C++, a switch can't be used with strings - it's just the way it is. In other languages like Java and C#, a switch can be used with strings, but it doesn't mean you would want to do it (as comparing strings can be more expensive than comparing integers).
To be honest, your code is a mess (which isn't surprising because you are new to this). A big problem that I see with your code is you are mixing UNICODE (LPWSTR), ANSI ("NE") and _T("Key") all over the place. Some of this code might work, depending on your compiler settings, but you need to understand what is going on otherwise it will bite you later.
As GCDEF mentioned you can't compare strings in C++ by comparing the pointers of the strings. The code below is comparing pointers;
Code:
if(return value == "NE")
This won't ever compare, because you are trying to compare the memory location of the variable value, with the memory location of the "NE" string literal and these won't be the same.
This might be confusing if you are coming from other languages like Java or C# because the strings in these languages are actually classes and the classes provide an overloaded == which compare the actual strings contained within the string classes.
In C++, you need to use actual string functions to do a string comparison. For ANSI strings you can use something like strcmp, for Unicode strings, wcscmp. For tchar, use _tcscmp. When you use std::string or std::wstring it can be problematic on Windows depending on which you using and what your character set compiler settings are.
A good place to start understanding this is http://www.codeproject.com/Articles/...TR-LPCTSTR-etc
-
October 10th, 2013, 02:31 PM
#13
Re: ussing if or Switch with LPCWSTR
Originally Posted by MR.Hotdog
Code:
#include "stdafx.h"
#include <iostream>
#include<Windows.h>
wchar_t ini_index[6];
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "INI FILE READING TEST PROGRAM" << std::endl << std::endl;
GetPrivateProfileStringW(_T("Test"),_T("Key"),_T("NE"),ini_index,5,_T("c:\\test.ini"));
wchar_t* vIn = ini_index;
char * vOut = new char[wcslen(vIn)+1];
wcstombs_s(NULL,vOut,wcslen(vIn)+1,vIn,wcslen(vIn)+1);
if(std::strcmp(vOut,"NE")==0) std::cout << "File\Key not Exists";
else if(std::strcmp(vOut,"ON")==0) std::cout << "I left my tv on";
else if(std::strcmp(vOut,"OFF")==0)std::cout<< "TV is boring"
else if(std::strcmp(vOut,"qefqd")==0)std::cout<<"My cat is walking over my keyboard";
system("pause");
return 0;
Compare that with this
Code:
#include "stdafx.h"
#include <iostream>
#include<Windows.h>
wchar_t ini_index[6];
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "INI FILE READING TEST PROGRAM" << std::endl << std::endl;
GetPrivateProfileString("Test", "Key", "NE", ini_index, 5, "c:\\test.ini");
wchar_t* vIn = ini_index;
char * vOut = new char[wcslen(vIn)+1];
wcstombs_s(NULL, vOut, wcslen(vIn) + 1, vIn, wcslen(vIn) +1 );
if(std::strcmp(vOut, "NE")==0)
std::cout << "File\Key not Exists";
else
if(std::strcmp(vOut, "ON") == 0)
std::cout << "I left my tv on";
else
if(std::strcmp(vOut, "OFF") == 0)
std::cout<< "TV is boring"
else
if(std::strcmp(vOut,"qefqd") == 0)
std::cout<<"My cat is walking over my keyboard";
system("pause");
return 0;
Start using whit space and proper indentation so your code is readable.
Next, you need to learn what your code is doing and that's what the debugger does. What is GetPrivateProfileString returning?
-
October 10th, 2013, 03:11 PM
#14
Re: ussing if or Switch with LPCWSTR
You can also simplify the code by using the CString class (just #include <atlstr.h>).
Code:
#include <stdio.h>
#include <tchar.h>
#include <atlbase.h>
#include <atlstr.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "INI FILE READING TEST PROGRAM" << std::endl << std::endl;
CString sKeyValue;
DWORD dwKeyValueMax = 5;
DWORD dwError = 0;
GetPrivateProfileString(
_T("Test"),
_T("Key"),
_T("NE"),
sKeyValue.GetBuffer(dwKeyValueMax),
dwKeyValueMax,
_T("C:\\test.ini")
);
sKeyValue.ReleaseBuffer();
// Check ::GetLastError here for != 0 to determine if GPPS failed (normally Win Api's return non-zero
// values to let you know when to call GetLastError, but GetPrivateProfileString doesn't work this way)
if(sKeyValue == _T("NE"))
{
std::cout << "File\Key not Exists" << std::endl;
}
else if (sKeyValue == _T("ON"))
{
std::cout << "I left my tv on" << std::endl;
}
else if(sKeyValue == _T("OFF"))
{
std::cout << "TV is boring" << std::endl;
}
else if(sKeyValue == _T("qefqd"))
{
std::cout << "My cat is walking over my keyboard" << std::endl;
}
else
{
std::cout << "Unrecognized value" << std::endl;
}
std::cout << std::endl;
system("pause");
return 0;
}
-
October 10th, 2013, 03:24 PM
#15
Re: ussing if or Switch with LPCWSTR
thanks a loth Arjay even with my limited englich i understend efrything you say.
tomorow i will go to the website to read that article
GCDEF also thanks a loth for all your posts.
i most say it looks clean how you changet my code.
always eazy to find things back to edit/fix it
rite now GetPrivateProfileString is returning "ON" becorse i have made the ini file
it returnts it value in-to wchar_t ini_index[6]; then convert it to char* vOut;
checking it with if(std::strcmp(vOut, "ON") == 0) printing I left my tv on to the screen
also ussd the other's "OFF" and "qefqd" always priting the right text to the screen
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|