Favicon Svethardware.cz  Svět hardware   Fórum Favicon Svetaudia.cz  Svět audia Favicon TVFreak.cz  TV Freak   Fórum Favicon Digimanie.cz  Digimanie   Fórum   Galerie Společnost oXy Online s.r.o.
Strana 1 z 3 123 PosledníPoslední
Zobrazené výsledky: 1 až 15 z 32

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

  1. #1
    Obyvatel SMob
    Registrace
    May 2006
    Příspěvků
    369

    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
    Odpovídat lze po přihlášení

  2. #2
    Starousedlík SMob
    Registrace
    Mar 2004
    Příspěvků
    1,452

    Tim tvym unicodovym fajlem myslis konkretne co? Musis znat kodovani. UTF-8,16? Nebo je to jen vyblitej dvoubajtovej text?
    Odpovídat lze po přihlášení



  3. #3
    Obyvatel SMob
    Registrace
    May 2006
    Příspěvků
    369

    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.
    Odpovídat lze po přihlášení

  4. #4
    Starousedlík SMob
    Registrace
    Jan 2004
    Příspěvků
    2,017

    Zpusobu je mnoho. STL jste zkousel? Psano z hlavy, protoze ted nejsem u pocitace s VS.NET.
    Kód:
    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
    Odpovídat lze po přihlášení

  5. #5
    Obyvatel SMob
    Registrace
    May 2006
    Příspěvků
    369

    Zdravim,
    tak jsem to pouzil takhle:

    Kód:
    std::wfstream mujtextak ("\\testik.txt", std::ios_base::in);
    std::wstring line;
    
    while(!mujtextak.eof() && !mujtextak.fail())
    {
    std::getline(mujtextak, line);
    }
    a hlasi mi to:

    Kód:
    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
    Nevite co s tim?
    Odpovídat lze po přihlášení

  6. #6
    Starousedlík SMob
    Registrace
    Jan 2004
    Příspěvků
    2,017

    Co treba #include (string)
    Misto kulatych zavorek samozrejme spicate, ty mi sem nejdou vlozit.
    Odpovídat lze po přihlášení

  7. #7
    Obyvatel SMob
    Registrace
    May 2006
    Příspěvků
    369

    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 :/

    Kód:
    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
    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:

    Kód:
    #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);
    }
    Odpovídat lze po přihlášení



  8. #8
    Starousedlík SMob
    Registrace
    Jan 2004
    Příspěvků
    2,017

    Budete mit jeste tezky programatorsky zivot Fakt doporucuju si neco nastudovat.
    Na wstringu pouzijte metodu c_str().
    Odpovídat lze po přihlášení

  9. #9
    Obyvatel SMob
    Registrace
    May 2006
    Příspěvků
    369

    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:

    Kód:
    MessageBox(NULL, line.c_str(), TEXT("Debug message"), MB_OK);
    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?
    Odpovídat lze po přihlášení

  10. #10
    Starousedlík SMob
    Registrace
    Mar 2004
    Příspěvků
    1,452

    A co takhle debugger? Tim se da zjistit mraky veci .
    Odpovídat lze po přihlášení

  11. #11
    Starousedlík SMob
    Registrace
    Jan 2004
    Příspěvků
    2,017

    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.


    Kód:
    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<wstring> 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<wstring>::iterator currIt = lines.begin(); currIt != lines.end(); currIt++)
    	{
    			MessageBox(NULL, currIt->c_str(), TEXT("Debug message"), MB_OK); 
    	}
    Kdyby vam chybely direktivy using/hlavicky
    Kód:
    #include (string)
    #include (vector)
    using namespace std;
    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.
    Odpovídat lze po přihlášení

  12. #12
    Obyvatel SMob
    Registrace
    May 2006
    Příspěvků
    369

    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.
    mi hazi chybu
    Kód:
    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
    Kazdopadne moc dekuji za Vasi pomoc zkusim to nejak doresit
    Odpovídat lze po přihlášení



  13. #13
    Starousedlík SMob
    Registrace
    Jan 2004
    Příspěvků
    2,017

    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.
    Odpovídat lze po přihlášení

  14. #14
    Starousedlík SMob
    Registrace
    Jan 2004
    Příspěvků
    2,017

    A tohle bude mozna jeste lepsi:

    Připojené soubory Připojené soubory
    Odpovídat lze po přihlášení

  15. #15
    Obyvatel SMob
    Registrace
    May 2006
    Příspěvků
    369

    Tak uz se nekam dostavam... ten Vas kod jsem "trosku ocesal" :

    Kód:
    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);
    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
    Odpovídat lze po přihlášení

Strana 1 z 3 123 PosledníPoslední

Podobná témata

  1. Cteni NTFS
    Od Baltazarek_ce4you v sekci Fujitsu Siemens Computers
    Reakcí: 1
    Poslední příspěvek: 24-12-2007, 00:14
  2. Jaký font na ASCII a UNICODE??
    Od atomion_ce4you v sekci Programování
    Reakcí: 5
    Poslední příspěvek: 02-04-2006, 19:32
  3. MobiPocket a UNICODE
    Od Petr_J v sekci eKnihy
    Reakcí: 8
    Poslední příspěvek: 14-05-2005, 09:37
  4. Novinky na Palmknihách - knihy v Unicode!
    Od Pavel Koza v sekci eKnihy
    Reakcí: 1
    Poslední příspěvek: 21-10-2004, 18:57