Good day to all, there is a binary file in which a program written in C ++ Builder is written, and which I need to rewrite. Faced the problem of reading and writing an array.
Below is the C # code:

using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open))) { // ΠΏΠΎΠΊΠ° Π½Π΅ достигнут ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π° // считываСм ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° while (reader.PeekChar() > -1) { int nk = reader.ReadInt32(); int N_vn = reader.ReadInt32(); int N_vv = reader.ReadInt32(); float d_vn = reader.ReadSingle(); float d_vv = reader.ReadSingle(); double t_n = reader.ReadDouble(); double t_k = reader.ReadDouble(); float L = reader.ReadSingle(); float P = reader.ReadSingle(); float Pm = reader.ReadSingle(); float Pp = reader.ReadSingle(); float kal_n = reader.ReadSingle(); float kal_v = reader.ReadSingle(); float res_v = reader.ReadSingle(); // float frez = reader.ReadSingle(); массив // int irez = reader.ReadInt32(); массив } } 

But the structure code written in Builder

 typedef struct { int nk; int N_vn,N_vv; float d_vn,d_vv; TDateTime t_n; TDateTime t_k; float L; float P,Pm,Pp; float kal_n,kal_v; float res_v; float frez[4]; int irez[4]; } str_pereval; 

Help please understand, thanks

  • And what is the problem? Clarify the question. - Dmitry D.
  • @DmitryD. the problem is that if you write like this: float[] frezi = new float[4]; frezi[4] = reader.ReadSingle(); float[] frezi = new float[4]; frezi[4] = reader.ReadSingle(); getting exception An unhandled exception of type 'System.IndexOutOfRangeException' occurred in binary.exe Additional information: ИндСкс находился Π²Π½Π΅ Π³Ρ€Π°Π½ΠΈΡ† массива. - Ethernets
  • @DmitryD. Understood my mistake, made otherwise: int i = 0; then in the cycle frezi[i] = reader.ReadSingle(); i++; frezi[i] = reader.ReadSingle(); i++; but on the second pass of the cycle I get an offset, because the array should fill up immediately, do I have to put another for loop for my solution? - Ethernets

1 answer 1

Thank you all solved the problem like this:

 float[] frez = new float[5]; int[] irez = new int[5]; using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open))) { // ΠΏΠΎΠΊΠ° Π½Π΅ достигнут ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π° // считываСм ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° while (reader.PeekChar() > -1) { int nk = reader.ReadInt32(); int N_vn = reader.ReadInt32(); int N_vv = reader.ReadInt32(); float d_vn = reader.ReadSingle(); float d_vv = reader.ReadSingle(); double t_n = reader.ReadDouble(); double t_k = reader.ReadDouble(); float L = reader.ReadSingle(); float P = reader.ReadSingle(); float Pm = reader.ReadSingle(); float Pp = reader.ReadSingle(); float kal_n = reader.ReadSingle(); float kal_v = reader.ReadSingle(); float res_v = reader.ReadSingle(); for (int i = 0; i <= 4; i++) { frez[i] = reader.ReadSingle(); irez[i] = reader.ReadInt32(); } Console.WriteLine("НомСр: {0} НомСр Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ: {1} НомСр Π½ΠΈΠΆΠ½Π΅Π³ΠΎ {2}", nk, N_vv, N_vn); } Console.ReadKey(); } 
  • logically, you need to read arrays in separate cycles, although of course it depends on how they were written there. - rdorn