UNICODE problem
-
Hello, i tried to load an unicode file but without luck, but i don't know whats wrong. The first char of the file will not be displayed correctly and then the following data is correct, but at the end there are some more charachters (rectangles) which are not in the file. Here is the code i use:
wchar_t *gg; FILE *wfile; wfile = _wfopen(L"ReadMe.txt",L"rb"); fseek(wfile,0,SEEK_END); int num = ftell(wfile); fseek(wfile,0,SEEK_SET); gg = (wchar_t*)malloc(sizeof(char)*num); fread(gg,sizeof(wchar_t),num,wfile); fclose(wfile); MessageBox(NULL,gg,L"file",0);
Thanks for help. -
Hello, i tried to load an unicode file but without luck, but i don't know whats wrong. The first char of the file will not be displayed correctly and then the following data is correct, but at the end there are some more charachters (rectangles) which are not in the file. Here is the code i use:
wchar_t *gg; FILE *wfile; wfile = _wfopen(L"ReadMe.txt",L"rb"); fseek(wfile,0,SEEK_END); int num = ftell(wfile); fseek(wfile,0,SEEK_SET); gg = (wchar_t*)malloc(sizeof(char)*num); fread(gg,sizeof(wchar_t),num,wfile); fclose(wfile); MessageBox(NULL,gg,L"file",0);
Thanks for help.You're allocating
num * sizeof(char)
and then trying to readnum * sizeof(wchar_t)
. That going to be your first problem :)"The secret of happiness is freedom, and the secret of freedom, courage." Thucydides (B.C. 460-400)
-
Hello, i tried to load an unicode file but without luck, but i don't know whats wrong. The first char of the file will not be displayed correctly and then the following data is correct, but at the end there are some more charachters (rectangles) which are not in the file. Here is the code i use:
wchar_t *gg; FILE *wfile; wfile = _wfopen(L"ReadMe.txt",L"rb"); fseek(wfile,0,SEEK_END); int num = ftell(wfile); fseek(wfile,0,SEEK_SET); gg = (wchar_t*)malloc(sizeof(char)*num); fread(gg,sizeof(wchar_t),num,wfile); fclose(wfile); MessageBox(NULL,gg,L"file",0);
Thanks for help.gabbana wrote:
wfile = _wfopen(L"ReadMe.txt",L"rb");
For text files, should this be:
wfile = _wfopen(L"ReadMe.txt", L"r");
gabbana wrote:
gg = (wchar_t*)malloc(sizeof(char)*num);
gg = (wchar_t*)malloc(sizeof(wchar_t)*num+1);
gg[num] = '\0'; // so that MessageBox() will not fail"Love people and use things, not love things and use people." - Unknown
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
-
gabbana wrote:
wfile = _wfopen(L"ReadMe.txt",L"rb");
For text files, should this be:
wfile = _wfopen(L"ReadMe.txt", L"r");
gabbana wrote:
gg = (wchar_t*)malloc(sizeof(char)*num);
gg = (wchar_t*)malloc(sizeof(wchar_t)*num+1);
gg[num] = '\0'; // so that MessageBox() will not fail"Love people and use things, not love things and use people." - Unknown
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
hmm, the problem still exists: one rectangle at the beginning at many after the file (>16)
wchar_t *gg; FILE *wfile; wfile = _wfopen(L"ReadMe.txt",L"r"); fseek(wfile,0,SEEK_END); int num = ftell(wfile); fseek(wfile,0,SEEK_SET); gg = (wchar_t*)malloc(sizeof(wchar_t)*num+1); fread(gg,sizeof(wchar_t),num,wfile); fclose(wfile); gg[num] = '\0'; // so that MessageBox() will not fail MessageBox(NULL,gg,L"file",0);
modified on Friday, May 2, 2008 10:16 AM
-
hmm, the problem still exists: one rectangle at the beginning at many after the file (>16)
wchar_t *gg; FILE *wfile; wfile = _wfopen(L"ReadMe.txt",L"r"); fseek(wfile,0,SEEK_END); int num = ftell(wfile); fseek(wfile,0,SEEK_SET); gg = (wchar_t*)malloc(sizeof(wchar_t)*num+1); fread(gg,sizeof(wchar_t),num,wfile); fclose(wfile); gg[num] = '\0'; // so that MessageBox() will not fail MessageBox(NULL,gg,L"file",0);
modified on Friday, May 2, 2008 10:16 AM
The problem has to do with the
FILE
structure containing achar
type rather than awchar_t
type. Convert fromchar
towchar_t
, like:char *gg = (char *) malloc(sizeof(char) * num + 1);
...
USES_CONVERSION;
LPWSTR lp = A2W(gg);MessageBox(NULL, lp, _T("file"), MB_OK);
"Love people and use things, not love things and use people." - Unknown
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
-
The problem has to do with the
FILE
structure containing achar
type rather than awchar_t
type. Convert fromchar
towchar_t
, like:char *gg = (char *) malloc(sizeof(char) * num + 1);
...
USES_CONVERSION;
LPWSTR lp = A2W(gg);MessageBox(NULL, lp, _T("file"), MB_OK);
"Love people and use things, not love things and use people." - Unknown
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
-
The problem has to do with the
FILE
structure containing achar
type rather than awchar_t
type. Convert fromchar
towchar_t
, like:char *gg = (char *) malloc(sizeof(char) * num + 1);
...
USES_CONVERSION;
LPWSTR lp = A2W(gg);MessageBox(NULL, lp, _T("file"), MB_OK);
"Love people and use things, not love things and use people." - Unknown
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
-
What does your modified code look like? Do you have
UNICODE
and_UNICODE
defined?"Love people and use things, not love things and use people." - Unknown
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
-
hmm, the problem still exists: one rectangle at the beginning at many after the file (>16)
wchar_t *gg; FILE *wfile; wfile = _wfopen(L"ReadMe.txt",L"r"); fseek(wfile,0,SEEK_END); int num = ftell(wfile); fseek(wfile,0,SEEK_SET); gg = (wchar_t*)malloc(sizeof(wchar_t)*num+1); fread(gg,sizeof(wchar_t),num,wfile); fclose(wfile); gg[num] = '\0'; // so that MessageBox() will not fail MessageBox(NULL,gg,L"file",0);
modified on Friday, May 2, 2008 10:16 AM
-
hi, You might want to try: gg = (wchar_t*)malloc(sizeof(wchar_t)*(num+1)); instead of gg = (wchar_t*)malloc(sizeof(wchar_t)*num+1); also, are you sure your file is in UNICODE format where each character is 16 bit wide?
In the project options i defined that the linke should use unicode instead of ascii. Now i also tried yours but without an effect. The file was written with notepad and i used the save as option and selected unicode as charset. Okay but now, i am a little bit confusing. i am not sure if i need this for my further learning cycle? Iam actually learning the winapi, but i think for productional use it would be better if i directly use the unicode file stream classes or the windows createfile function to read a file or not ? So i think its not important or i am wrong?
-
In the project options i defined that the linke should use unicode instead of ascii. Now i also tried yours but without an effect. The file was written with notepad and i used the save as option and selected unicode as charset. Okay but now, i am a little bit confusing. i am not sure if i need this for my further learning cycle? Iam actually learning the winapi, but i think for productional use it would be better if i directly use the unicode file stream classes or the windows createfile function to read a file or not ? So i think its not important or i am wrong?
It actually all depends on the project requirements, but I suppose its better to create projects with UNICODE defined and keep your textual data in unicode format. Prefered in my opinion should be UTF-8 which uses less space. If you are loading a text file you should somehow know its encoding type. If you are using Notepad to save text in Unicode format then file contains some extra information bytes about actual encoding type - it is easy to see them in binary file view. Some info on actual notepad format encoding can be found here: http://blogs.msdn.com/michkap/archive/2007/04/22/2239345.aspx[^] There are some other errors in your code that might be the cause of the errory you describe. For example ftell() return length of the file in bytes..., here is a code I got working quite well: wchar_t *gg; FILE *wfile; wfile = _wfopen(L"c:\\ReadMe.txt",L"r"); fseek(wfile,0,SEEK_END); int num = ftell(wfile); fseek(wfile,2,SEEK_SET); int buffSize = sizeof(wchar_t)*(num/2+1); gg = (wchar_t*)malloc(buffSize); memset(gg, 0, buffSize); fread(gg,sizeof(wchar_t),(num-1)/2,wfile); fclose(wfile);