11. juni 2006 - 22:18
Der er
11 kommentarer og 1 løsning
Filer med fixed record size
Jeg har brug for, at kunne læse, skrive, og hoppe til en specifik record i en fil. Alle records har en fast størrelse. Da jeg stadig er grønlig i C# og google ikke rigtig er fremkommet med en løsning, søger jeg derfor de lokale guruers guldkorn og best-practice. Jeg har f.eks. en record struktur som denne (uspecifikt sprog...) byte Cmd; byte[64] FileName; // eller char[64] ?? I selve programmet vil jeg selvfølgelig behandle FileName som en string. Spørgsmålet er: Hvordan læser/skriver man til en fil record med fast længde i C#? /doc
Annonceindlæg fra FPT Software
new FileStream Read eller Write af det rigtige antal bytes Seek til recordno*recordsize hvis du vil hoppe til en bestemt record
byte=8 bit char=16 bit i C# så der er stor forskel !
Arne... Har styr på de ting der ;-) Men hvordan skriver man f.eks. en c# string til en fil, så den fylder f.eks. 64 bytes - og læser den tilbage igen?
Encoding.UTF8.GetBytes(dinstreng) giver et byte array det padder du med det nødvendige antal nul bytes og skriver så til filen
når du lser så skipper du trailing nul bytes og bruger Encoding.UTF8.GetString(ditbytearray)
jeg kan godt lave et eksempel hvis det skulle være
Tak Arne - du fik mig guidet i den rigtige retning. Er kommet frem til en løsning ala denne - som blot skriver en str og læser denne igen.... class Program { static void Main(string[] args) { byte[] x; FileStream fs = new FileStream(@"c:\temp\test.dat", FileMode.Create); string y = "Hello world"; y = y.PadRight(64); x = Encoding.ASCII.GetBytes(y); fs.Write(x,0,x.Length); fs.Seek(0, SeekOrigin.Begin); fs.Read(x, 0, 64); string p = Encoding.ASCII.GetString(x).Trim(); Console.WriteLine("[" + p + "]"); fs.Close(); Console.WriteLine("Done"); Console.ReadLine(); } } Eller er der en nemmere måde?
Det er måden. Jeg ville nok ikke bruge Encoding.ASCII men enten Encoding.Default eller Encoding.UTF8 ... Vær opmærksom på at ASCII og Default har 1 char->1 byte d.v.s. at du kan padde string som du gør, men UTF8 har 1 char->1 eller 2 byte hvilket betyder at du er nødt til at padde byte arrayet.
Hvordan padder man nemmest et byte array? String paddingen ville p.t. være ok for mig - men, man kan jo lige så godt se lidt frem ad... Og drop lige et svar
12. juni 2006 - 02:49
#10
jeg ville bare: fs.Write(data,0,data.Length); fs.Write(padding,0,64-data.Length); ved write
12. juni 2006 - 02:51
#11
og ved Read ville jeg: actuallen = 64; while(data[actuallen-1]==padval) actuallen--; string s = enc.GetString(data,0,actuallen);
12. juni 2006 - 02:51
#12
Og et svar
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.