2011-09-09 6 views
1

저는 BinaryWriter를 사용하여 다음과 같이 Delphi Prism을 사용하고 이진 파일을 만들고 쓰는 중입니다.Delphi Prism : BinaryWriter "Write 메서드"가 Delphi의 Writeln 메서드와 동일하게 작동합니까?

method TUnit.Write(bw:BinaryWriter); 
var 
    i:Integer; 
begin 
    bw.write(ord(uType)); 
    bw.Write(ord(State)); 
    bw.Write(Address); 
    bw.Write(SubAddress); 

    for i:=1 to 20 do 
     bw.Write(fDefs[i]); 
end; 

내 질문에 대한 답. write 메소드는 줄 바꿈이나 줄 바꿈이나 캐리지 리턴이없는 문자 뒤의 바이트 또는 문자 뒤에 줄을 작성합니까?

내가이 질문을하는 이유는 문자 배열과 같은 특정 문자 수없이 문자열을 쓰고 읽는 것에 혼란 스럽기 때문입니다. 예를 들어

:

method WritetoFile; 
var 
    x:integer; 
    thestr:string; 
begin 
    BinaryWriter thefile := new BinaryWriter(File.Create("test.dat")); 
    thefile.write(thestr); 
    thefile.write(x); 
    thefile.Close; 
end; 

method ReadFromFile; 
var 
    x:integer; 
    thestr:string; 
begin 
    BinaryReader thefile := new BinaryReader(File.OpenRead("test.dat")); 
    thestr:=thefile.ReadString; 
    x:=thefile.ReadInt32; 
    thefile.Close; 
end; 

그건 내 프로그램을 작성하고 잘 작동하는 것 같다,하지만 난 혼란 스러워요 말했듯이 방법은 다음과 같습니다.

문자열 데이터 형식 일 때 읽고 쓸 길이를 지정하지 않고 읽고 쓸 수있는 바이트 수를 어떻게 알 수 있습니까?

답변

4

BinaryWriter "Write 메서드"는 Delphi의 Writeln 메서드와 동일하게 작동합니까?

아니요.

읽거나이 그것을 읽을 수있는 길이의 특정 번호를 부여하지 않고 문자열 데이터 형식 인 경우 작성하는 방법 바이트 또는 문자 길이를 알고 있나요 어떻게?

여러 가지면에서 BinaryWriterBinaryReader이 실제로 어떻게되는지 알 필요가 없습니다. 올바르게 사용하고 있습니다. 각각의 Write() 전화를 적절한 유형의 ReadXXX() 전화와 쌍으로 연결하면됩니다.

documentation은 기본 이진 파일 형식을 설명합니다. 이진 I/O 클래스는 사용자를 대신하여 정확하게 수행하므로 문자열의 길이를 쓰거나 읽을 필요가 없습니다.

길이가 접두사로 묶여있는 문자열은 문자열 앞에 해당 문자열의 길이가 포함 된 단일 바이트 또는 단어 접두어를 붙임으로써 문자열 길이를 나타냅니다. 이 메서드는 먼저 문자열의 길이를 UTF-7로 인코딩 된 부호없는 정수로 쓴 다음 BinaryWriter 인스턴스의 현재 인코딩을 사용하여 해당 문자를 스트림에 씁니다.

따라서 줄 바꿈이 포함 된 문자열을 안전하게 쓸 수 있으며 읽으면 해당 줄 바꿈이 유지됩니다.

2

아니요. 원하는 것을 수행하는 WriteLine 및 Write 메서드가있는 StreamWriter를 사용하려고합니다. binaryReader/Writer 클래스는 Length에 접두사 정수를 사용하고 데이터를 씁니다.

+1

사실, @digitalanalog가 텍스트 작성자보다 BinaryWriter가 원하는 것이 더 많습니다. –