Cum să citiți și să scrieți corect liniile într-un flux

# xA0; # xA0; // Scrieți.
# xA0; s: = "un text";
# xA0; k: = Lungimea (lungimile);
# xA0; aStream.Write (k, 4);
# xA0; aStream.Write (s [1], k);

# xA0; # xA0; // Citiți.
# xA0; aStream.Read (k, 4);






# xA0; SetLength (s, k);
# xA0; aStream.Read (s [1], k);

Este întotdeauna bine?

aStream.Read (k, SizeOf (Integer));
SetLength (s, k);
aStream.Read (PChar (s) ^, k * SizeOf (Char));

SizeOf (Char) este semnificativ, deoarece în ultimele versiuni ale Delphi liniile implicite sunt unicode.


> Este întotdeauna cazul?

Este întotdeauna corect să utilizați metodele Read / WriteBuffer.
Citește metode / scriere nu raportează eroarea, dacă este cazul, din orice motiv apar în cursul unui flux de citire / scriere, cu condiția ca rezultatele acestor metode suna te ignora complet.

Aici nu este corect:
aStream.Read (s [1], k);

trebuie să o rescrieți astfel:

aStream.ReadBuffer (k, 4);
SetLength (s, k);
dacă k> 0 atunci
# xA0; aStream.ReadBuffer (s [1], k);
În caz contrar, dacă lungimea șirului este zero, atunci când apelați s [1], acesta va ieși din limite.

Și dacă lungimea liniei este mai mare de 255, atunci nu există nici o depășire?
Înțeleg că un șir este o serie de caractere, în elementul zero a cărui lungime s [0] este scrisă. Și elementul este un octet.

Codul din clase este următorul:

procedura TStream.ReadBuffer (tampon var; Count: Longint);
începe
# xA0; dacă (Con <> 0) și (Citiți (Buffer, Count) <> Count) atunci
# xA0; # xA0; ridicați EReadError.CreateRes (@SReadError);
se încheie;

Procesarea unora nu este corectă. În cazul în care numărul = 0. nu este necesar să emită erori, dar pur și simplu nu au nimic de a citi din fluxul, și face să apară ca și în cazul în care 0 bytes au fost citite.







Dacă numărați mai puține date decât în ​​flux, ar trebui să afișați o fereastră cu trei butoane, "repetați", "opriți", "ignorați". Dacă repetați, înseamnă că încercați să terminați citirea datelor necesare, dacă o ignorați, atunci vă prefaceți că totul este normal, dacă îl opriți, atunci generați o excepție.


> Și dacă lungimea liniei este mai mare de 255, atunci nu există nici o depășire?
>
> Înțeleg că un șir este o serie de caractere, la zero
> la elementul căruia este scrisă lungimea s [0]. Și elementul este un octet.
>
>

Astfel de linii nu au fost văzute de mult timp.

> Și dacă lungimea liniei este mai mare de 255, atunci nu există nici o depășire?
> Înțeleg că un șir este o matrice de caractere, în elementul zero a cărui lungime s [0] este scrisă. Și elementul este un octet.

> Sunt compatibile cu Delphi 7?
dcu sunt incompatibile pentru orice versiune de Delphi


> Serghei # xA0; (18.11.10 16:29) [4]

> Procesarea unor greșeli

Prelucrarea este corectă, nu purtați nonsens.
Este capul tău sau logica în ea este greșită)

Nu doriți excepții care să vă spună despre această problemă?
Da, folosiți citirea / scrierea pentru sănătate, nimeni nu obiectează.
Dar atunci nu obiecta ulterior curbe Windu și Delphi, dacă nu răspund la rezultatele lor de întoarcere, mai devreme sau mai târziu, treci peste ea cu o grebla)

În acest sens, cel puțin sortați-l)
Și în acest "plutitor", și acolo - schiuri vă spălați în produse mult mai complexe)


> Procesarea unora nu este corectă. Dacă numără = 0. atunci
> este necesar să se spună orice eroare

În conformitate cu codul dat, nu există erori în cazul numărului = 0 și nu.


> Dacă numărați mai puține date decât există în flux, atunci aveți nevoie
> afișați o fereastră cu trei butoane, "repetați", "opriți",
> # xA0; "ignorați".

Imaginați-vă situația: codul este executat pe server în modul server. Adică nu este prezent niciun utilizator, dar cererea programului client este pur și simplu procesată. A existat o astfel de situație.
Și cine va apăsa butonul? Până când ați dat clic, firul este în picioare, clientul crede că serverul sa prăbușit (de fapt, așa este).


> Dacă repetați, înseamnă că încercați să terminați citirea necesarului
> date, dacă ignorăm, atunci pretindeți că totul este citit
> Este normal, dacă opriți, atunci veți genera o excepție.
>

Și atunci utilizatorul știe cum, puteți ignora această eroare și ce este scris în fluxul dvs.?

Memorie: 0,75 MB
Timpul: 0.037 c







Articole similare

Trimiteți-le prietenilor: