Reading and Writing

Top  Previous  Next

What is translated > Reading and Writing

Delphi has Stream classes to read and write files similar to those in C#. But there are also an classic, non-object oriented Pascal routines for this purpose. For this classic approach there are three file types, which have no counterpart in C#


1.File;  declares an untyped file to read or write binary data
2.Text or TextFile; declares a text file to read or write ASCII data
3.File of [type]; declares a typed file to read and write sequences of that type (records).


Delphi2C# tries to convert this classic approach to the C# object-oriented approach. For all three file types in C# a Stream is created at first. In a second step in dependence of the different Delphi file types different kinds of Streams are created from the first basic stream. For example a StreamWriter will be created, if ASCII data shall be written to a Text file:




  myFile : Text;




  AssignFile(myFile, 'Test.txt');





  Stream myFile_stream;


  myFile_stream = new FileStream("Test.txt", FileMode.Create);

  using (StreamWriter myFile = new StreamWriter(myFile_stream)) {





In Delphi the access mode of these file types are specified by the FileMode variable. In C# there also exists a FileMode, but this variable specifies how to open a file, eg. create a new file or append to an existing file. Therefore the Delphi FileMode variable cannot be defined in the C# code. In translated code the Delphi FileMode is passed as explicit parameter to the file opening commands, "FileMode.Create" in the example above. "FileMode.CreateOrOpen" is the FileMode for readers.The kind of opening a file  in Delphi is determined by the command which is used to open the file. The ReWrite command and the Reset command are truncating an existing file or creating a new file, whereas the Append command opens a file to add output to the existing content of a file.


The default FileMode in Delphi is fmOpenReadWrite (=2). but in C# a stream cannot have read and write access at the same time. Delphi2C# therefore looks at the subsequent use of the stream. If writing operations are following a Writer is created else a Reader is created. If the Delphi code really reads and writes to the file without resetting it, the translation will fail.


If a Write function is called with a file as first parameter, the output will be written into that file. Otherwise the Output is written to the console:


WriteLn(myFile, 'Hello');









The same for Read-functions:


Read(myFile, Letter); 





Letter = (char) myFile.Read();

Letter = (char) Console.Read(); 




For Files and Files of a type Delphi2C# creates BinaryReader and BinaryWriter. Delphi2C# only converts uses of File of [builtin type]  An automatic treatment of files of records might partly be possible, but hasn't be done so far.



  myWord : WORD;

  myFile : File of WORD;



  AssignFile(myFile, 'Test.cus');



  While not Eof(myFile) do


    Read(myFile, myWord);







ushort myWord = 0;

Stream myFile_stream;


myFile_stream = new FileStream("Test.cus", FileMode.OpenOrCreate);

using (BinaryReader myFile = new BinaryReader(myFile_stream, System.Text.Encoding.ASCII)) {


while(!(myFile.PeekChar() < 0))


  myWord = (ushort) myFile.ReadInt16();



} // using 




Delphi2C# also converts Rename commands.

The width and precision arguments in write operations aren't converted correctly yet.











This page belongs to the Delphi2C# Documentation

Delphi2C# home  Content