Strona: [  << <   1 2   > >>  ]  z  2     
Autor Temat: Problem z odczytywaniem zakodowanego tekstu
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004
Problem z odczytywaniem zakodowanego tekstu

Witam

Otóż tak jak w temacie - mam plik, w kótrym znajduje się zakodowany String np. "@#%@%#@%@#@"

I wszystko byłoby OK gdyby nie fakt, że czasami zdarza się że odczytywana linia z tego pliku (niekoniecznie pierwsza) jest obcięta czyli nie odczytuje całej linii tylko jej fragment np. "@#%"

Wiem, ze podobny problem był już poruszany ale nie mogę znaleźć tego postu <lol>

Być może pewien znak po zakodowaniu zamienia się w jakiś ze znaków specjalnych np. Chr(27)?

Pozdrawiam


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

23-08-2004 16:00
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
bisiek




Typ: neutral
Postów: 487
Zarejestrowany: Jul 2003

1. To będzie prawdopodobnie znak 26 lub 0

2. Podaj więcej szegółów - jak odzytujesz linie itp.


_____________________________________________
www.mob.abc.pl - moja strona o VB

23-08-2004 17:12
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       3380672
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Linię odczytuję tak:

Open PathName For Input As #FN
While Not EOF(FN)
    Line Input #FN, Text
Wend
Close #FN

A konkretnego przykładu nie potrafię podać.

Poprostu czasami po zapisaniu do pliku zakodowanego tekstu np. "Ala ma kota" i próbie odczytu zwraca "Ala" (akurat dla "Ala ma kota" działa normalnie )

Pozdrawiam


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

23-08-2004 17:21
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
bisiek




Typ: neutral
Postów: 487
Zarejestrowany: Jul 2003

Wczytuje cały tekst do zmiennej:

Dim a As String
Open "C:\test.txt" For Binary As #1
a = Space(LOF(1))
Get #1, , a
Close #1


_____________________________________________
www.mob.abc.pl - moja strona o VB

23-08-2004 17:56
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       3380672
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

No dobra tylko co to da ??

Poza tym i tak muszę czytać linię po linii a tak to musiałbym użyć jakichś separatorów do wydzielenia pewnych fragmentów tekstu

Co do Binary też wcześniej tak myślałem ale pozostałem przy Input (chociaż odczytywanie bajt po bajcie jest chyba rozwiązaniem problemu)

Pozdrawiam


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

23-08-2004 18:02
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Może rób wszystko tak samo, ale otwieraj plik w trybie binary, nie input?


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

23-08-2004 19:51
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Tylko, że w trybie Binary trzeba zadeklarować najpierw długość zmiennej typu string, do której będzie przypisywana cała linia. Problem w tym, że nie wiem określić długość linii np. jeśli zmienną text zadeklaruję String*1 to funkcja Get przypisze jeden znak

Może w ogóle opiszę co chciałem zrobić:

1. Mam ListView z dwoma kolumnami
2. Klikam Button "Otwórz" i pokazują mi się wszystkie wcześniej wpisane pozycje
3. Przykładowo usuwam 5 pozycje w lisview i dodaję kilka nowych
4. Naciskam Button "Zapisz" i zapisuje mi wszystkie pozycje w pliku Dat (tekst w Listview jest zakodowany)

I jeżeli chodzi o zapis wszystko działa a gdy chcę otworzyć to zdarza sie że przy zdekodowaniu którejś pozycji nie zwraca całej lini tylko jej fragment

Nie zawsze tak jest ale zdarza się

Czekam na porady. Pozdrawiam


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

23-08-2004 21:24
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Nie rozumiem. Po co masz deklarować długosć zmiennej przy pobieraniu całej linii?
Przecież Line Input po prostu wsadzi ci w tą zmienną linię, bez okreslania wcześniejszego rozmiaru zmiennej... @_@


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

23-08-2004 22:03
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Line Input nie działa gdy ustawimy tryb Binary


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

23-08-2004 23:46
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

A sprawdziłeś chociaż?

Bo ja nie pamiętam kiedy ostatni raz używałem innego trybu, a Line Input używam dość często.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

24-08-2004 10:31
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Sprawdzałem już metody otwarcia pliku z wykorzystaniem Open na wszystkie sposoby i nie działa

Pozdrawiam


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

24-08-2004 10:34
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Wpisałem kod:
Sub main()
    Dim fFile As Integer
    Dim sLine As String
   
    fFile = FreeFile
    Open "c:\autoexec.bat" For Binary Access Read As fFile
    Do Until EOF(fFile)
        Line Input #fFile, sLine
        Debug.Print sLine
    Loop
    Close fFile
End Sub

Uruchomiłem, w okienku Immediate otrzymałem:

mode con codepage prepare=((852) C:\WINDOWS\COMMAND\ega.cpi)
mode con codepage select=852
keyb pl,,C:\WINDOWS\COMMAND\keybrd4.sys
PATH c:\;c:\windows\;c:\windows\command;c:\programy\nc

@del c:\windows\f*{*}*.tmp >nul
@del c:\~ >nul

@xmsdsk 640 l: /y >nul
@label l:tempdisk


Program został wykonany bezbłędnie.

Wnioseki:
1) Działa
2) Nie sprawdziłeś wszystkich metod


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

24-08-2004 10:42
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Nie wiem czemu ale nie dodało mojego jednego postu ale mało ważne

Hmmm to ciekawe czemu to nie działa z

While Not EOF(File)

Poza tym nie dodałem Access Read (chociaż to akurat chyba nie ma znaczenia)

Poza tym w twoim przykładzie działa wszystko oki bo tekst nie jest zakodowany. U mnie też wszystko działa dla znaków standardowych. W momencie kiedy zakoduję tekst i próbuję go odczytać pojawiają się błędy - obcina linie (nie zawsze)

Spróbuję z tą twoją pętlą - zobaczymy

Pozdrawiam


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

24-08-2004 11:31
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

A podaj jeszcze, na jakim konkretnym znaku występuje problem?


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

24-08-2004 11:33
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Stworzyłem plik wypełniony znakami od 0 do 255.
Użyłem swojej funkcji do wczytania go. I wszystko działa dobrze...

[Post edytowany dnia 24-08-2004 11:44 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

24-08-2004 11:43
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

właśnie w tym problem bo różnie bywa - ale błąd pojawia się przeważnie gdy tekst zakodowany zawiera znaki specjalne czyli od 0 do 31 - wcina się jakiś znak, nie wiem jaki - tylko tyle że po zakodowaniu jest to kwadrat - czasami też zdarza się, że błąd wyskakuje przy spacji chociaż gdy odczytuję numer tej niby spacji pokazuje mi wartość 0 a powinno pokazywać 32

Przykładowy tekst:

Z pliku tekstowego:

CGAACLG@M}zz} B  EF 

Po wklejeniu tutaj tekst zamienił się na:

CGAAC
LG@M}zz} B  EF 

I właśnie po odczycie pliku zwracało tylko CGAAC czyli znakiem, który powodował błąd był "Enter"

Jak już pisałem różnie bywa

Pozdrawiam


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

24-08-2004 11:49
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

No i d*pa - z twoją pętlą też nie działa ;(


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

24-08-2004 12:25
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Jak się tutaj dodaje pliki <lol> - moze zapodam ci ten plik i zobaczysz


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

24-08-2004 12:27
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Hmm... zrobiłem kilka testów i wygląda to tak:
Line Input kończy linię, gdy natrafi na:
Cr (13)
CrLf (13,10)

Lf (10)
Null (0)

Znaki (lub grupy znaków) oznaczone na zielono dzielą linię wg. dokumentacji do Line Input dostarczanej przez Microsoft w MSDN. Natomiast najwyraźniej zapomnieli tam napisać, że również dwa inne znaki (zaznaczone tutaj na czerwono) tak działają. Inne znaki do 31 włacznie nie mają takiego efektu.

Teraz nie powinieneś już miec problemu .

A dla wszystkich przestroga na przyszłosć: nigdy nie ufajcie całkowicie dokumentacjom.

[Post edytowany dnia 24-08-2004 12:30 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

24-08-2004 12:28
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Ale czemu w trybie Binary nie traktuje tego jak zwykłego znaku - poza tym w moim pliku tekstowym nie dzieli tego tekstu na dwie linie tylko wszystko jest w jednej linii


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

24-08-2004 12:31
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
Wszystkich odpowiedzi: 33 :: Maxymalnie na stronę: 20
Strona: [  << <   1 2   > >>  ]  z  2