Recenze  |  Aktuality  |  Články
Doporučení  |  Diskuze
Auto-Moto
Mobilní telefony
Notebooky  |  Tablety
Příslušenství
Wearables  |  Ostatní
Svět hardware  |  Digimanie  |   TV Freak

[WM5/6, C++]: Cteni z Unicode textoveho souboru

bkf1_ce4you (368)|22.2.2008 09:52
Zdravim vsechny,
uz tyden se snazim najit FUNKCNI kod na cteni z Unicode textoveho souboru. Je to pro me neuveritelne, ale tento "problem" snad neni nikde vyresen :( Najde se tu nekdo (treba RStein me tedka napadlo :) ), kdo by mi napsal nejakou rutinku na tenhle "slozity programatorsky orisek"? Predem dekuji vsem i treba za pokusy, ktere by me snad mohli privezt na reseni ;)
Saman_ce4you (1451)|22.2.2008 10:49
Tim tvym unicodovym fajlem myslis konkretne co? Musis znat kodovani. UTF-8,16? Nebo je to jen vyblitej dvoubajtovej text?
bkf1_ce4you (368)|22.2.2008 11:40
Mno myslim tim obycejnej textak ulozenej na PC v notepadu s kodovanim "Kódování Unicode" (nevim co to je za UTF popiska zni "Kódování Unicode") do kteryho bych psal cesky, rusky atd. (rad bych mozna do budoucna potreboval i podporu cinskych, japonskych znaku a to nevim jestli tohle kodovani v notepadu s nazvem "Kódování Unicode" zvlada - mno zatim to neni nutne hlavni je cestina, rustina atp. a to urcite tohle kodovani bude zvladat). A potreboval bych taky vedet, jak cist z konkretnich radku napr. kdyz chci precist 1. znak ze 4. radku atp.
RStein (2012)|22.2.2008 13:17
:) Zpusobu je mnoho. STL jste zkousel? Psano z hlavy, protoze ted nejsem u pocitace s VS.NET.
[CODE]

std::wfstream myFile (pathToFile, std::ios_base::in);
std::wstring line;

while(!myFile.eof() && !myFile.fail())
{
std::getline(myFile, line);
if(!line.empty())
{
//Neco neco
}

}

l[/CODE]
bkf1_ce4you (368)|22.2.2008 13:46
Zdravim,
tak jsem to pouzil takhle:

[CODE]
std::wfstream mujtextak ("\\testik.txt", std::ios_base::in);
std::wstring line;

while(!mujtextak.eof() && !mujtextak.fail())
{
std::getline(mujtextak, line);
}
[/CODE]

a hlasi mi to:

[CODE]
Error 1 error C2039: 'getline' : is not a member of 'std' c:\Documents and Settings\Administrator\Plocha\SIP-test2\dvorak_implementation.cpp 303 dvoraksip
Error 2 error C3861: 'getline': identifier not found c:\Documents and Settings\Administrator\Plocha\SIP-test2\dvorak_implementation.cpp 303 dvoraksip
[/CODE]

Nevite co s tim?
RStein (2012)|22.2.2008 19:35
:) Co treba #include (string)
Misto kulatych zavorek samozrejme spicate, ty mi sem nejdou vlozit.
bkf1_ce4you (368)|22.2.2008 20:04
Jo ted uz to slo zkompilovat. Ted bych potreboval nejakej zpusob, jak si overit, co se vlastne nacetlo ze souboru, ale MessageBox i OutputDebugString nechteji pracovat s "std::wstring" a ja nevim jak to konvertnout na LPCWSTR :/

[CODE]Error 1 error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'std::wstring' to 'LPCWSTR' c:\Documents and Settings\BKF1\Plocha\SIP-test2\dvorak_implementation.cpp 298 dvoraksip
[/CODE]

Neznate prosim nejaky zpusob, jak se "mrknout" do te promene at si muzu overit co se tam vlastne nacetlo? Jinak dekuji zatim za dosavadni rady ;) Jeste upresnim, jak tedy vypada nynejsi kod:

[CODE]
#include (string) // hranate zavorky misto kulatych
#include (fstream) // hranate zavorky misto kulatych
using namespace std;


std::wfstream mujtextak ("\\testik.txt", std::ios_base::in);
std::wstring line;

while(!mujtextak.eof() && !mujtextak.fail())
{
std::getline(mujtextak, line);
}[/CODE]
RStein (2012)|22.2.2008 20:19
Budete mit jeste tezky programatorsky zivot ;) Fakt doporucuju si neco nastudovat.
Na wstringu pouzijte metodu c_str().
bkf1_ce4you (368)|25.2.2008 16:14
Mno jestli se budu jeste hrabat ve Visual C++, tak to budu mit jeste hodne tezky, protoze je to pro me velice narocny jazyk a vzhledem k casove tisni jsem nucen "programovat" modifikaci ruznych samplu, co najdu na netu :( Mno ja myslim jenom doresim, cteni z Unicode textaku + nahravani BMP do resource a kaslu na to = vracim se k NetCF C#, se kterým nemám problém ;) Uz jsem si neco nastudoval, ale Visual C++ je pro me tak narocny jazyk, ze je to pro me nekdy fakt peklo :( jo zlatej Pascal a nebo NetCF C# :)

Jinak kdyz se vratime k VC++ tak podle samplu co jsem nasel na netu jsem pouzil metodu "c_str()" nasledovne:

[CODE]MessageBox(NULL, line.c_str(), TEXT("Debug message"), MB_OK);[/CODE]

ale po zkompilovani se zobrazi prazdny MessageBox (zkousel jsem nacitat ceske znaky i obycejne treba "abc"). Zkousel jsem Unicodovy textak zamenit za ASCII textak a to fungovalo ok, tak bych rekl, ze jsem asi spatne pouzil metodu "c_str()" :( Mate jeste nervy mi pomoci s timhle? :)
Saman_ce4you (1451)|25.2.2008 16:48
A co takhle debugger? Tim se da zjistit mraky veci ;).
RStein (2012)|25.2.2008 20:06
Priznam se, ze jsem nemel chut resit, jaka konverzni funkce a locale vam chybi,ani vas zatahovat do sveta codecvt, takze tady jsem vam napsal obecnou funkci pres CreateFile.

Tady je rutina, ktera nacte soubor ulozeny v notepadu jako "Unicode" a rozparsuje jednotlive radky a ulozi je do vectoru. Jednodusi to mit asi nemuzete :) Psano v rychlosti a tak, abyste nemel problemy s pochopenim a upravami - vrele doporucuju po zkopirovani zavest konstanty a rozsekat rutinu do mensich funkci, pouzit smart pointery atd.


[CODE]
HANDLE hFile = CreateFile(_T("\\test.txt"),
GENERIC_READ,
NULL,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if (!hFile)
{
return -1;
}

DWORD fileSize = GetFileSize(hFile, NULL);
int size = (fileSize / 2) + (1 * sizeof(WCHAR));
WCHAR *buffer = new WCHAR[size];
if (!buffer)
{
CloseHandle(hFile);
return -1;
}

ZeroMemory(buffer, fileSize + sizeof(WCHAR));
if (!ReadFile(hFile, buffer, fileSize, &fileSize, NULL))
{

CloseHandle(hFile);
delete [] buffer;
return -1;
}

CloseHandle(hFile);

//Preskoceni BOM
std::wstring currentContent(buffer+1, size -1);
delete [] buffer;

std::wstring::size_type position = std::wstring::npos;
std::wstring::size_type oldPosition = 0;

position = currentContent.find(_T("\r\n"), 0);

std::vector lines;

while(position != std::wstring::npos)
{
wstring line = currentContent.substr(oldPosition, position - oldPosition);
lines.push_back(line);
oldPosition = position + 2;
position = currentContent.find(_T("\r\n"), oldPosition );
}

std::wstring lastLine = currentContent.substr(oldPosition, currentContent.length() -1);
lines.push_back(lastLine);

for(std::vector::iterator currIt = lines.begin(); currIt != lines.end(); currIt++)
{
MessageBox(NULL, currIt->c_str(), TEXT("Debug message"), MB_OK);
}
[/CODE]

Kdyby vam chybely direktivy using/hlavicky
[CODE]
#include (string)
#include (vector)
using namespace std;

[/CODE]
A ja samozrejme miluju take C#, ale povazuju jazyk jen za pracovni lopatu, kterou mohu rychle vymenit .

Za dva dny se da C++ naucit, za tyden se rozepisete a nekoukate do
dokumentace a za 14 dni pisete treba vlastni adaptovane funkce a genericke algoritmy dle STL vzoru. Vlastni zkusenost.

A C++ je jazyk, ktery s nami bude jeste dlouho (bohuzel? :) ), a pri poradnem psani pro PDA se stejne nevyhnete volani nativnich funkci a (vlastnimu) marshalovani argumentu.
bkf1_ce4you (368)|28.2.2008 14:57
Zdravim Vas,
dekuji za sample... uz se tim snazim prokousat nejakou dobu, ale moc se mi nedari mno snad to nejak zvladnu... hazi to celkem dost erroru napr.
[CODE][/CODE]
mi hazi chybu
[CODE]Error 1 error C2275: 'WCHAR' : illegal use of this type as an expression e:\_WORK\Dokumenty\Visual Studio 2008\Projects\TestUnicode\TestUnicode\TestUnicode.cpp 44 TestUnicode[/CODE]
Kazdopadne moc dekuji za Vasi pomoc zkusim to nejak doresit ;)
RStein (2012)|28.2.2008 19:57
Take zdravim.

Tohle neni chyba samplu, ten se da zkompilovat v pohode.
Ale spatne je prekopirovan a zalaman tady na foru:
Tohle je sprave
WCHAR *buffer = new WCHAR(size);
Misto kulatych zavorek hranate.
RStein (2012)|28.2.2008 19:59
A tohle bude mozna jeste lepsi:

bkf1_ce4you (368)|28.2.2008 20:53
Tak uz se nekam dostavam... ten Vas kod jsem "trosku ocesal" :) :

[CODE]HANDLE hFile = CreateFile(_T("\\fread.out"),GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

DWORD fileSize = GetFileSize(hFile, NULL);
int size = (fileSize / 2) + (1 * sizeof(WCHAR));
WCHAR *buffer = new WCHAR[size];

ZeroMemory(buffer, fileSize + sizeof(WCHAR));
ReadFile(hFile, buffer, fileSize, &fileSize, NULL);

CloseHandle(hFile);


MessageBox(NULL, buffer, TEXT("Debug message"), MB_OK);[/CODE]

Mno a uz mi MessageBox zobrazuje Unicode znaky (čeština a ruština). Sice pred temi znaky je jako prvni zobrazen "□" ctverecek (neznamy znak) ale tak to snad pujde odstranit zasahem do promenne "buffer". Mno dekuji MOC za pomoc bez Vas bych se toho asi nikdy nedobral ;)
bkf1_ce4you (368)|28.2.2008 20:55
aaa tak jeste zkusim ten "TestDel.cpp" ;) dekuji ;)
bkf1_ce4you (368)|28.2.2008 21:00
jo supr funguje to diky MOC!!! bez Vas bych to fakt nedal dohromady na celym netu neni jediny fungujici sample :( jeste jednou MOC dekuji ;)
RStein (2012)|28.2.2008 21:36
bkf1: Ale fakt ten kod neocesavejte!!!! Jsou tam i vsechny potrebne prevody - vcetne vyrazeni BOM "podivneho" prvniho znaku. :) A hlavne musite uklizet pamet!!!!! Pole WCHARu je dynamicke...

edit: // Uz vite, proc na svych kurzech tak brojim proti sorte vyvojaru zvane "Googliste", jak jsem psal drive;)

At se dari. :)

bkf1_ce4you (368)|28.2.2008 23:12
jj Vas kod plne zuzitkuju ;) uklid sice nemam moc ve zvyku, ale tak snazim se ;) mno a "Googlista" to jsem presne ja :D snazim se ale hlavne si pomoct sam, abych neotravoval dalsi lidi ;)
-p- (54)|12.4.2008 15:34
[QUOTE]
Za dva dny se da C++ naucit, za tyden se rozepisete a nekoukate do
dokumentace a za 14 dni pisete treba vlastni adaptovane funkce a genericke algoritmy dle STL vzoru. Vlastni zkusenost.[/QUOTE]

tady je zase nekdo chytry jako sova :sarcastic:
tomu snad ani sam nemuzete verit, a pokud ano, tak jsem rad, ze vase programy nepouzivam

"Za tyden uz nekoukate do dokumentace" - hm, chtel bych videt takoveho borce, co se to nauci i za mesic/za rok. Jestli nekdo pise bez dokumentace a pouziva c/c++, stl, windows api a ovlada cely .net framework, tak je borec. Vy asi jste a nebo trochu namysleny. Co na to rict...

ps: neberte to prosim jako urazku :)
bkf1_ce4you (368)|12.4.2008 15:42
mno ja bych se tomu musel venovat intenzivne tak rok abych umel zaklady C++ WinAPI :D jsem se vratil k C# a to je takova uleva... :)
-p- (54)|12.4.2008 16:22
jj, to verim ;) Ale na druhou stranu jsou programy pod .NetCF na mobilnich zarizenich dost pomale oproti nativnim. A jako vzdy to zase nejspise vyresi rychlejsi procesor.
bkf1_ce4you (368)|12.4.2008 16:33
a zkousel jste nove NetCF 3.5? oproti 2.0 je dost znacny narust rychlosti;) je to znat uz pri nabehu aplikace;) akorat na nekterych ROM je treba po instalaci v registrech natvrdo nastavit aby se pouzivala verze 3.5 (http://www.siemensmania.cz/forum/viewtopic.php?t=33008).
Saman_ce4you (1451)|12.4.2008 17:00
paia: Jazyk C++ jako takovy se da intezivnim pouzivanim naucit rychle. STL se da za chvili zvladnout taky.
O znalostech WIN32 API a .NET predtim nebyla zadna zminka, to sis nejak doplnil..
Zakladni sada fci pro vetsinu aplikaci WIN32 API (shell, window management) se taky osvoji celkem rychle. Samozrejme, obcas se clovek musi podivat do doc na nejaky styl apod..
Vse to je proste o zkusenostech a taky nadani..

Takze jestli neceho ty nejsi schopny, tak to automaticky neznamena ze nekdo dalsi neni..
RStein (2012)|12.4.2008 17:02
paia: Melo tam byt, za tyden uz TOLIK nekoukate do dokumentace. A z toho, ze nepouzivate moje programy, jsem se skoro zhroutil :)
Byt Vami - misto kecani do C++.bych si nejprve osvojil zaklady funkcni gramotnosti a ve slovniku si vyhledal slova jako hyperbola, nadsazka, ironie. o zadnem uceni se.Net Frameworku jsem nemluvil, pouze o uceni C++, kdyz mate uz znalosti objektoveho programovani a soucasne znate syntaxi C jazyku. Jazyk je jen lopata, ktera se da rychle vymenit a postupne si rychle osvojite specialitky daneho jazyka.
Za 14 dni se ale da opravdu naucit a napsat docela dost veci :). A adaptivni algoritmy jsem byl opravdu nucen psat po 14 dnech. :)
RStein (2012)|12.4.2008 17:33
A jeste jedna vec. Take si tio paio neberte jako urazku. A na vysvetleni meho prispevku. Muzete si vsimnout, ze se v dalsich tematech podobnych subjektivnich vylevu nedopoustim - postouchnout kolegu BKF1 jsem si ale neodpustil, protoze jsem predtim videl par jeho prispevku, kde z bohorovne pozice tepal do jinych programu kvuli plagiatorstvi, kazal o zkazenosti sveta, ze kterho mizi originalita a ja tohle vizionarsko-subverzivni mysleni nemam rad... :)
Saman to vystihl presne, diky.
bkf1_ce4you (368)|12.4.2008 18:14
[QUOTE="RStein"]z bohorovne pozice tepal do jinych programu kvuli plagiatorstvi[/QUOTE]
Muzete upresnit co myslite?

[QUOTE="RStein"]kazal o zkazenosti sveta, ze kterho mizi originalita[/QUOTE]
Presne tak :D
RStein (2012)|12.4.2008 19:04
[QUOTE="bkf1"][QUOTE="RStein"]z bohorovne pozice tepal do jinych programu kvuli plagiatorstvi[/QUOTE]
Muzete upresnit co myslite?
[/QUOTE]
Mohu ;), treba zde:
http://smartmania.mobilmania.cz/forum/viewtopic.php?t=4713
http://smartmania.mobilmania.cz/index.php?ind=news&op=news_show_single&ide=990
//edit:
A plagiatorstvi je obecne napadnuto hlavne zde. Predpokldal jsem, zr i rozhrani telefonu.
http://mobil.idnes.cz/diskuse.asp?iddiskuse=A070922_192311_mob_samsung_ada
A pak prispevek, ktery nemohu najit a ktery napadal stale stejne finger friendly klavesnice a programy.
Neberte si to nijak osobne, bohuzel nemam moc dar zapominat a co jsem si jednou precetl/slysel se mi take automaticky vybavi :)
bkf1_ce4you (368)|12.4.2008 19:30
ja si proste nemuzu pomoct kdyz vidim tak minimalni snahu rozvinout dobry napad jako je ovladani prsty tak se proste nekdy neudrzim :) plagiatorstvi je mi ukradeny at si vsichni kopiruji (a hlavne rozvijeji) vsechny dobre napady hlavne kdyz z toho maji prospech uzivatele o to jedine mi jde;)
-p- (54)|12.4.2008 21:47
Saman:
Syntaxe jazyka se da nepochybne naucit rychle, ale k cemu vam bude? Zapominate na to, ze i kdyz se nekdo nauci za 2 dny syntaxi jazyka, tak jaksi bez znalosti API, knihoven a zkusenosti nema moc sanci neco napsat. Zkuste prejit z Javy do .Netu nebo naopak. Jazyk je skoro stejny...

bkf1 dela v C#/.NetCF a chce prejit na C++, predpokladam, ze ne na Managed C++, tzn. musi naucit nejen syntanxi C++, ale i Windows API.

Dokumentaci se snad jasne mysli dokumentace k API a dalsim knihovnam a ne popis syntaxe jazyka. Do dokumentace se divaji vsichni, i zkuseni senior programatori.

[QUOTE]
Samozrejme, obcas se clovek musi podivat do doc na nejaky styl apod..
Vse to je proste o zkusenostech a taky nadani..
Takze jestli neceho ty nejsi schopny, tak to automaticky neznamena ze nekdo dalsi neni..
[/QUOTE]
Na to se da rict jen, ze vam to preju.

[QUOTE]Byt Vami - misto kecani do C++.bych si nejprve osvojil zaklady funkcni gramotnosti a ve slovniku si vyhledal slova jako hyperbola, nadsazka, ironie. o zadnem uceni se.Net Frameworku jsem nemluvil, pouze o uceni C++, kdyz mate uz znalosti objektoveho programovani a soucasne znate syntaxi C jazyku.[/QUOTE]
Ja mam pocit, ze v dnesni dobe je ironicky snad uz kazdy. Nemam potrebu nekomu neco dokazovat, ale "postouchl" jsem si stejne jako vy :)
bkf1_ce4you (368)|13.4.2008 01:44
[QUOTE="Paia"]bkf1 dela v C#/.NetCF a chce prejit na C++[/QUOTE]
bkf1 nechce prejit na C++ a bude se branit jak jen to pujde :)
Saman_ce4you (1451)|13.4.2008 10:26
[QUOTE="Paia"]Zkuste prejit z Javy do .Netu nebo naopak. Jazyk je skoro stejny...[/QUOTE]

Aktivne programuju v C++/Java/C#. Kdyz to nekdo dela dnes a denne a neni lama, tak proste v 90% pripadu dokumentaci k API nepotrebuje..