Avatar billede doc404 Novice
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
Avatar billede arne_v Ekspert
11. juni 2006 - 22:20 #1
new FileStream
Read eller Write af det rigtige antal bytes
Seek til recordno*recordsize hvis du vil hoppe til en bestemt record
Avatar billede arne_v Ekspert
11. juni 2006 - 22:21 #2
byte=8 bit
char=16 bit
i C# så der er stor forskel !
Avatar billede doc404 Novice
11. juni 2006 - 22:34 #3
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?
Avatar billede arne_v Ekspert
11. juni 2006 - 23:21 #4
Encoding.UTF8.GetBytes(dinstreng)

giver et byte array

det padder du med det nødvendige antal nul bytes og skriver så til filen
Avatar billede arne_v Ekspert
11. juni 2006 - 23:22 #5
når du lser så skipper du trailing nul bytes og bruger

Encoding.UTF8.GetString(ditbytearray)
Avatar billede arne_v Ekspert
12. juni 2006 - 00:34 #6
jeg kan godt lave et eksempel hvis det skulle være
Avatar billede doc404 Novice
12. juni 2006 - 02:08 #7
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?
Avatar billede arne_v Ekspert
12. juni 2006 - 02:29 #8
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.
Avatar billede doc404 Novice
12. juni 2006 - 02:35 #9
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
Avatar billede arne_v Ekspert
12. juni 2006 - 02:49 #10
jeg ville bare:

fs.Write(data,0,data.Length);
fs.Write(padding,0,64-data.Length);

ved write
Avatar billede arne_v Ekspert
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);
Avatar billede arne_v Ekspert
12. juni 2006 - 02:51 #12
Og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester