none
Z C na C#

    Dotaz

  • Ahoj všem, ovládám základy v C a C++, teď chci zkusit i C# a rád bych, kdyby mi někdo napsal, jak bych tento kód zapsal v C#

    #pragma pack(1)
    struct MY_ITEM
    {
     char title[64];
     char comment[64];
     unsigned short year;
     unsigned short index;
     unsigned char section;
     unsigned char enabled;
    };
    #pragma pack()
    
    MY_ITEM it[8];
    //----------------------------------------------------------
    void LoadFromFile(const char *filename)
    {
     FILE *fi = fopen(filename, "rb");
     if(fi)
     {
      fread(it, sizeof(MY_ITEM), 8, fi);
      fclose(fi);
     }
    }

    V kódu samozřejmě není ošetření chyb, je to kvůli jednoduchosti. V podstatě mě jde o to, jak načíst data ze souboru ve formě struktur o pevně dané velikosti.

    Kód v C# bych prosil včetně chybových hlášení. Mě by to moc pomohlo do začátku.

     
    • Upravený Kutil pátek 12. prosince 2014 14:35
    pátek 12. prosince 2014 14:19

Odpovědi

  • Není tomu tak, jenom musíte použít serializace, zde konkrétně zřejmě binární (de)serializace pomocí BinnaryFormatter-u:

    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
    MyObject obj = (MyObject) formatter.Deserialize(stream);
    stream.Close();
    
    // Here's the proof.
    Console.WriteLine("n1: {0}", obj.n1);
    Console.WriteLine("n2: {0}", obj.n2);
    Console.WriteLine("str: {0}", obj.str);


    https://msdn.microsoft.com/en-us/library/4abbf6k0(v=vs.110).aspx


    Robert Haken, Microsoft MVP ASP.NET/IIS, HAVIT, s.r.o., www.havit.cz, http://knowledge-base.havit.cz

    úterý 27. ledna 2015 16:28
    Moderátor

Všechny reakce

  • Nesnažil bych se za každou cenu "přepisovat kód". Programovací jazyky nejsou jen o tom, že kód se přepisuje. C# je jazyk, který budeš ve světě MS používat společně s .NET frameworkem a proto se k řešení "úloh" přistupuje trochu jinak. Nepamatuji si už přesně jak je to v C ale v .NET frameworku existuje celá řada tříd, které poskytují metody pro práci se soubory a většinu práce za tebe tedy vyřeší.

            public string Text { get; set; }
    
            void LoadFromFile(string filename)
            {
                using (StreamReader streamReader = new StreamReader(filename))
                {
                    Text = streamReader.ReadToEnd();
                    streamReader.Close();
                }
            }

    Toto je samozřejmě načtení obyčejného textu do stringu. Pro strukturovaná data bych spíše doporučil serializaci do XML a uložení dat jako XML, případně použít formát JSON, který je úspornější. Podívej se na můj článek jak si napsat MarkDown blog, ve kterém tyto principy využití JSON nastiňuji. Obecně jde o to

    1. Máš C# třídu, kterou chceš serializovat do souboru ve formátu JSON
    2. Máš metodu, která umí načíst serializovaná data do/ze souboru (viz. snipper výše)
    3. Máš metodu, která umí načtená data ze souboru deserializovat na objekty nebo serializovat pro uložení (viz. odkaz na můj článek)
    pondělí 15. prosince 2014 8:06
  • Děkuji za odpověď.

    Jde mi o to protože, potřebuji mít data uložena v určitém formátu, ten měnit nemůžu, protože jej využívá další software. Zkrátka výstup musí tvořit data v podobném formátu jaký jsem výše uvedl, jen těch položek je tam asi 40 (jsou to hodnoty různých typů a řetězce v ASCII).

    Zatím jsem nikde na netu nenašel rozumnou ukázku toho, jak v C# takovouto strukturu zapisovat a číst ze souboru.

    pondělí 15. prosince 2014 16:04
  • Děkuji.

    V podstatě, když to (snad správně) shrnu, tak v C# je takováto (v C/C++ úplně triviální) věc velice složitá, protože v podstatě člověk musí každý objekt ve struktuře načíst zvlášť.

    sobota 27. prosince 2014 14:13
  • Není tomu tak, jenom musíte použít serializace, zde konkrétně zřejmě binární (de)serializace pomocí BinnaryFormatter-u:

    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
    MyObject obj = (MyObject) formatter.Deserialize(stream);
    stream.Close();
    
    // Here's the proof.
    Console.WriteLine("n1: {0}", obj.n1);
    Console.WriteLine("n2: {0}", obj.n2);
    Console.WriteLine("str: {0}", obj.str);


    https://msdn.microsoft.com/en-us/library/4abbf6k0(v=vs.110).aspx


    Robert Haken, Microsoft MVP ASP.NET/IIS, HAVIT, s.r.o., www.havit.cz, http://knowledge-base.havit.cz

    úterý 27. ledna 2015 16:28
    Moderátor
  • Myslím, že ne.

    S BinaryFormater se kromě hodnot zapisují také informace o objektu. Pokud musím dodržet výstupní formát, tak je podle mě takovýto postup nevhodný. Tedy pokud jsem něco nedělal špatně.

    Pokud se pletu tak mi prosím zde ukažte jak zapsat do souboru obsah tohoto objektu:

    muj_objekt //(je mi jedno jestli to bude struktura nebo třída) { char[] title = new char[64]; char[] comment = new char[64]; ushort year; ushort index;

    byte section;

    byte enabled;

    void Funkce()

    {

    } };

    zapsat hodnoty od title po enabled, výstupní data musí mít v tomto případě velikost 262





    • Upravený Kutil sobota 7. února 2015 12:05
    sobota 7. února 2015 11:35