Hi All,
I have a Random access file which is written using VB 6.0.
I need to read this file using C#.
The record used in VB to write the Random access file is as follows
Type AA
aa1 As Integer
aa2 As Integer
aa3 As Integer
aa4 As Integer
aa5 As Integer
aa6 As Integer
aa7 As Integer
aa8 As Integer
aa9 As Integer
aa10 As String * 10
aa11 As String * 20
aa12 As String * 20
aa13 As String * 20
aa14 As String * 20
aa15(1 To 20) As String * 150
aa16(1 To 40) As Integer
aa17(1 To 3) As String * 20
aa18 As Byte
aa19 As String * 1
aa20 As Byte
aa21 As Byte
aa22 As Byte
aa23 As Byte
aa24 As Byte
aa25 As Byte
aa26 As Byte
aa27 As Byte
aa28 As Byte
aa29l(1 To 20) As Double
aa30(1 To 20) As Single
aa31 As Byte
aa32 As String * 20
aa33 As Byte
aa34 As Byte
aa35 As Byte
aa36 As Integer
aa37 As Double
aa38 As String * 25
aa39 As String * 25
aa40 As String * 25
aa41 As Byte
aa42 As Integer
aa43 As Integer
aa44 As String * 10
aa45 As String * 15
End Type
This is the structure that i have created in C# to match the record in VB
[StructLayout(La youtKind.Sequen tial,Pack =1,CharSet = CharSet.Ansi)]
public struct AAStructure{
public short aa1;
public short aa2;
public short aa3;
public short aa4;
public short aa5;
public short aa6;
public short aa7;
public short aa8;
public short aa9;
[MarshalAs(Unman agedType.ByValA rray,SizeConst =10)]
public char[] aa10;
[MarshalAs(Unman agedType.ByValA rray,SizeConst =20)]
public char[] aa11;
[MarshalAs(Unman agedType.ByValA rray,SizeConst =20)]
public char[] aa12;
[MarshalAs(Unman agedType.ByValA rray,SizeConst =20)]
public char[] aa13;
[MarshalAs(Unman agedType.ByValA rray,SizeConst =20)]
public char[] aa14;
[MarshalAs(Unman agedType.ByValA rray, SizeConst = 20)]
public String150[] aa15;
[MarshalAs(Unman agedType.ByValA rray, SizeConst = 40,ArraySubType =
UnmanagedType.I 2)]
public short[] aa16;
[MarshalAs(Unman agedType.ByValA rray, SizeConst = 3)]
public String20[] aa17;
public byte aa18;
public char aa19;
public byte aa20;
public byte aa21;
public byte aa22;
public byte aa23;
public byte aa24;
public byte aa25;
public byte aa26;
public byte aa27;
public byte aa28;
[MarshalAs(Unman agedType.ByValA rray, SizeConst = 20, ArraySubType =
UnmanagedType.I 4)]
public int[] aa29;
[MarshalAs(Unman agedType.ByValA rray, SizeConst = 20, ArraySubType =
UnmanagedType.R 4)]
public Single[] aa30;
public byte aa31;
[MarshalAs(Unman agedType.ByValA rray,SizeConst =20)]
public char[] aa32;
public byte aa33;
public byte aa34;
public byte aa35;
public short aa36;
public int aa37;
[MarshalAs(Unman agedType.ByValA rray,SizeConst =25)]
public char[] aa38;
[MarshalAs(Unman agedType.ByValA rray,SizeConst =25)]
public char[] aa39;
[MarshalAs(Unman agedType.ByValA rray,SizeConst =25)]
public char[] aa40;
public byte aa41;
public short aa42;
public short aa43;
[MarshalAs(Unman agedType.ByValA rray,SizeConst =10)]
public char[] aa44;
[MarshalAs(Unman agedType.ByValA rray,SizeConst =15)]
public char[] aa45;
}
[StructLayout(La youtKind.Sequen tial, Pack = 1, CharSet = CharSet.Ansi)]
public struct String150 {
[MarshalAs(Unman agedType.ByValA rray, SizeConst = 150)]
public char[] value;
}
[StructLayout(La youtKind.Sequen tial, Pack = 1, CharSet = CharSet.Ansi)]
public struct String20 {
[MarshalAs(Unman agedType.ByValA rray, SizeConst = 20)]
public char[] value;
}
however, if i read the random access file using the structure, i am not getting the correct values in the structure data members.
Is my structure correct ?
Am i missing any thing ?
Thanks in advance for any help,
regards,
knuckels23
4 2665
Are you reading the record using VB6 into a VB6 structure, and then trying to pass that structure to a C# application using COM Interop?
Or are you simply reading the file using C#?
If you are reading the file using C#, you do not need all the COM Interop attributes. C# would not care what application wrote the file and you could read the file and fill the struct using native types and methods.
That said, either way, I see you interpreted all your source integers as C# shorts, which are 16 bit, not 32. Was that your intent? Are the values always less than 32768?
Just to check, are all the source strings fixed length? That is, is a VB source string * 10 guaranteed to occupy 10 characters or blanks in the file, or is there a chance they could be shorter?
Any issues with encoding?
Have a read through Default Marshalling For Strings and Default Marshalling For Arrays
Sometimes StringBuffer and not char[] is needed for the unmanaged code to fill with fixed string data.
Perhaps post a sample snippet of how you are filling the C# structure...ple ase do not post every field: that is overkill when posting for problem solving.
Also, please describe what you mean when you say you are not getting correct values: are they blank, are there exceptions thrown, are they all off by one, are they complete garbage data, etc.
Finally, USE THE "CODE" tags when posting code, out of courtesy to the forum.
Thanks,
Mike
Are you reading the record using VB6 into a VB6 structure, and then trying to pass that structure to a C# application using COM Interop?
Or are you simply reading the file using C#?
If you are reading the file using C#, you do not need all the COM Interop attributes. C# would not care what application wrote the file and you could read the file and fill the struct using native types and methods.
That said, either way, I see you interpreted all your source integers as C# shorts, which are 16 bit, not 32. Was that your intent? Are the values always less than 32768?
Just to check, are all the source strings fixed length? That is, is a VB source string * 10 guaranteed to occupy 10 characters or blanks in the file, or is there a chance they could be shorter?
Any issues with encoding?
Perhaps post a sample snippet of how you are filling the C# structure...ple ase do not post every field: that is overkill when posting for problem solving.
Also, please describe what you mean when you say you are not getting correct values: are they blank, are there exceptions thrown, are they all off by one, are they complete garbage data, etc.
Finally, USE THE "CODE" tags when posting code, out of courtesy to the forum.
Thanks,
Mike
Hi Mike,
Thanks for the reply.
I apologize for posting all the fields and not using the code tags.
1. I am simply reading the file using C# .
2."C# would not care what application wrote the file and you could read the file and fill the struct using native types and methods." - I may be wrong here, but I still have to specify the interop attributes for Array and fixed string's ??
3. " That said, either way, I see you interpreted all your source integers as C# shorts, which are 16 bit, not 32. Was that your intent? Are the values always less than 32768?" - I may be wrong here too, but I think Integers in VB means 2 BYTES, that's why I mapped it to a C# Short.
4. The document based on which i am working states that all the source strings will be of fixed length, how ever i will double check it.
5.The data is not encoded, so i believe there should not be any issues of encoding.
6. I will Post the code that i am using to populate the Structure in C#, how ever before that i need to know whether the my C# structure maps the VB structure.
STRIPED DOWN VB STRUCTURE - Type AA aa1 As Integer aa10 As String * 10 aa15(1 To 20) As String * 150 aa16(1 To 40) As Integer aa17(1 To 3) As String * 20 aa18 As Byte aa19 As String * 1 aa29(1 To 20) As Double aa30(1 To 20) As Single aa37 As Double End Type
MATCHING C# STRUCTURE - [StructLayout(LayoutKind.Sequential,Pack =1,CharSet = CharSet.Ansi)] public struct AAStructure{ public short aa1; [MarshalAs(UnmanagedType.ByValArray,SizeConst =10)] public char[] aa10; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public String150[] aa15; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40,ArraySubType=UnmanagedType.I2)] public short[] aa16; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public String20[] aa17; public byte aa18; public char aa19; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20, ArraySubType =UnmanagedType.I4)] public int[] aa29; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20, ArraySubType =UnmanagedType.R4)] public Single[] aa30; public int aa37; } [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] public struct String150 { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 150)] public char[] value; } [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] public struct String20 { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public char[] value; }
Can you please check the above code ??
Thanks a ton again for the swift response and thanks in advance again for any further help .
regards,
knuckels23
If the VB integers are two bytes, then you were correct to use short.
Looking over the two structs, it certainly looks correct to me, but of course one would have to test and verify. Not sure about 29 and 37 where you call the VB Double a C# int, but I assume you determined it was the correct match.
OK, I may be missing something, but if indeed you are simply reading a file, be it binary or ascii, using C#, you do not need the Interop attributes.
Interop means a .net (managed) application is talking directly to a non-.NET (unmanaged) application and exchanging data via structures, such as you created.
Although the VB app wrote the data to a file where each record represents the VB type you posted, ONCE IT IS WRITTEN the file has no concept of those structures. It is simply character or binary data.
Now, in order to read it, the .Net IO classes only see a file with a series of bytes. IF the content is text, the TextReaders need to know the encoding and what the EndOfLine character is, and they are happily off reading it.
If the content is binary, which is probably your case, then yes, the BinaryReader has read methods which need to know the data type it is reading. For example: ReadInt16() will read two bytes from the stream and output a short which you can than store or use however you want.
However, it does not need to know about String150[] for example, or any other types beyond primitive. If there are 20 strings each 150 characters, then you can either call ReadChars(150) 20 times, or even ReadChars(3000) . Once you have that data, then yes, you can store it in a struct like the one you created in order to emulate the VB source. But the binary reader only needs to know primitive types.
Finally, even if you do create your own struct and fill it using the BinaryReader, as long as you are not trying to send it back to the VB application, or get it from the VB application, THERE IS NO INTEROP, and hence you do not need those attributes.
I suppose they don't really hurt either (I am not sure if the compiler treats the struct any differently with the Interop attributed declared...it might)...but they certainly are not needed.
Does that clear things up? I guess bottom line, we can simplify your code, remove unecessary attributes, remove the custom structs (for now...just to get through the reading part) and concentrate on the problems with reading the data correctly.
PS. I may not get to respond again until monday. Apologies.
If the VB integers are two bytes, then you were correct to use short.
Looking over the two structs, it certainly looks correct to me, but of course one would have to test and verify. Not sure about 29 and 37 where you call the VB Double a C# int, but I assume you determined it was the correct match.
OK, I may be missing something, but if indeed you are simply reading a file, be it binary or ascii, using C#, you do not need the Interop attributes.
Interop means a .net (managed) application is talking directly to a non-.NET (unmanaged) application and exchanging data via structures, such as you created.
Although the VB app wrote the data to a file where each record represents the VB type you posted, ONCE IT IS WRITTEN the file has no concept of those structures. It is simply character or binary data.
Now, in order to read it, the .Net IO classes only see a file with a series of bytes. IF the content is text, the TextReaders need to know the encoding and what the EndOfLine character is, and they are happily off reading it.
If the content is binary, which is probably your case, then yes, the BinaryReader has read methods which need to know the data type it is reading. For example: ReadInt16() will read two bytes from the stream and output a short which you can than store or use however you want.
However, it does not need to know about String150[] for example, or any other types beyond primitive. If there are 20 strings each 150 characters, then you can either call ReadChars(150) 20 times, or even ReadChars(3000) . Once you have that data, then yes, you can store it in a struct like the one you created in order to emulate the VB source. But the binary reader only needs to know primitive types.
Finally, even if you do create your own struct and fill it using the BinaryReader, as long as you are not trying to send it back to the VB application, or get it from the VB application, THERE IS NO INTEROP, and hence you do not need those attributes.
I suppose they don't really hurt either (I am not sure if the compiler treats the struct any differently with the Interop attributed declared...it might)...but they certainly are not needed.
Does that clear things up? I guess bottom line, we can simplify your code, remove unecessary attributes, remove the custom structs (for now...just to get through the reading part) and concentrate on the problems with reading the data correctly.
PS. I may not get to respond again until monday. Apologies.
Hi,
Apologies for the delayed updation.
The issue was with the Double Data type.
I have managed to fix the problem.
Thanks for you help.
regards,
karthik
Sign in to post your reply or Sign up for a free account.
Similar topics |
by: Oin Zea |
last post by:
Is it possible for to program to access a random file at the same time and
perform actions like create a new record?
|
by: Job Lot |
last post by:
I have tab delimited text file which gets populated on daily basis via
automated process. New entry is written at the bottom. I need to create a
utility which makes a copy of this file with 10 most recent entries.
When I read line using StreamReader object it starts from the top, so
looping though lines and keeping track of the line is not helpful. Is there
anyway to start reading from the bottom or if anyone could suggest some other...
|
by: Darsant |
last post by:
I'm currently reading 1-n number of binary files, each with 3 different
arrays of floats containing about 10,000 values a piece for a total of
about 30,000 values per file.
I'm looking for a way to load them all into memory. I've tried using
vector pushback with reserving, but it was horribly slow. The current
method I am using is upon opening the file and reading the number of
values, resizing the vectors (I have 3, one for each data...
|
by: Magnus |
last post by:
allrite folks, got some questions here...
1) LAY-OUT OF REPORTS
How is it possible to fundamentaly change the lay-out/form of a report in
access? I dont really know it that "difficult", but listen up;
Reports, the way I look at them, all present data downwards, in this way;
TITLE
data
|
by: djj858 |
last post by:
Another newbie question:
How do I begin reading data, but starting from the xth line down a
list? In other words, how do I skip the first lines and not read in
those values?
| |
by: bnob |
last post by:
I must read a txt file and when I found a line beginning with the word
"Backup", I must replace this line with "Save"
The read and the write must done into the same file!
I know how to read line after line a file (I use StreamReader), but how
can I write during I read the file ??
--
Ceci est une signature automatique de MesNews.
|
by: VB.NET |
last post by:
I'm using a mysql database and connecting my vb.net program to the DB over a
network connection. i would like to bring this data over to a vb.net random
access file. does anyone know how to convert my DB into a binary file? and
how to convert my code to use a file instead of the db?
|
by: Yi Xing |
last post by:
Hi All,
I want to read specific lines of a huge txt file (I know the line #).
Each line might have different sizes. Is there a convenient and fast
way of doing this in Python? Thanks.
Yi Xing
|
by: kaminekutte |
last post by:
Hi everybody,
I have been trying to parse a 100MB log file(tab separated). Basic aim is to read the file randomly, do some procesing and then display the contents of the file line by line. Working with randon access file class makes reading very slow.
Is there any alternative to random access files class in java whereby faster file processing is possible??
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
| |
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |