Pliki typowane i strtury - lub coś podobnego

0

Witam, jestem w fazie początkowej "zabawy" z C#.
Chciałbym zapisać sobie pewne dane w postaci rekordów, do pliku.

W C/C++ użyłbym np.
Np.
struct {
int : p1;
string : p2;
} dane;

w delphi "record" a tu... ?

Problem polega na tym, że pojęcia nie mam jak coś takiego zrealizować w C#, oczywiście chciałbym "skakać" po pliku, z miejsca na miejsce, mieć możliwość edycji owych rekordów.
Stąd też prośba o pomoc - jak to zrobić ? Ew. jakieś linki proszę bo zielony jestem w tym temacie.

Btw. wybaczcie, że składnia zdań i ogólne przedstawienie problemu nie spójne - spałem 3h :[

0

Poczytaj o serializacji.

1

To zależy jak je chcesz serializować?

Serializacja binarna jest przydatna jeśli chcesz tylko przechować stan (i wczytać), bo modyfikacja tak skompresowanych danych jest bardzo truda (albo i niemożliwa).

Serializacja XML jest fajna :D. Ale nie każdemu odpowiada, z wiadomych powodów (wszystkie wady xml jak leci).

Jeśli żadne z powyższych ci się nie podoba to trzeba będzie do bazy danych.
(jakby co to napisz)

0

serializacja moze nie do konca ciebie zadowalac (jesli mamy do dyspozycji ciag bajtow a nie mozemy XML'a czy binaryformatera) hasla:

  • klasa Marshall i jej metody
  • StructLayout
  • no i niestety unsafe bo beda wskazniki

reszta bedzie wygladac jak w C++ tylko trzeba zamieniac wskaznik<-->struktura

0

cholera... to C# utrudnia mi życie :] Znowu coś co można zrobić łatwo, szybko i przyjemnie komplikuje się do niebotycznych rozmiarów.

Chciałbym uniknąć XML, bazy danych odpadają bo to jak strzelać do muchy z armaty - a ja potrzebuje zapisywać/zmieniać/usuwać co najwyżej 30-40 "rekordów".

Wychodzi na to, że muszę poczytać o tym co podał reichel - no chyba, że ktoś zaproponuje coś innego.

Tak w ogóle, to jak można przechowywać dane piszą w C# : baza, XML, plik tekstowy -> coś jeszcze ? Coś zbliżonego do plików typowanych, których tak mi brakuje ?:>

0

Zawsze możesz sobie zapisać dane do pliku txt, odpowiednio je formatując oczywiście ;P I będziesz miał w postaci rekordów, do pliku.

0
Dane x = new Dane(); //.... //zapis BinaryFormatter bf = new BinaryFormatter(); FileStream fs = new FileStream("plik.dat", System.IO.FileMode.Create); bf.Serialize(fs, x); fs.Close(); //odczyt fs = new System.IO.FileStream("plik.dat", FileMode.Open); Dane y = (Dane)bf.Deserialize(fs); ``` nie o to Ci chodzi? Mozesz odpowiednio zdefiniowac rodzaj formatowania i zasade jego dzialania(interfejsy IFormatter, IOnDeserializationCallback, ISerialize)
0

to rozwiazania na "pol OK". cala radosc w pliku opartym na strukturach byla w tym, ze mozna bylo wychaczyc jedno pole i tylko je zmienic w pliku (bo bylo o stalej dlugosci). W tych rozwiazaniach tego nie ma.

Mozna co prawda serializowac cala liste ale trzeba calosc czytac i zapisac.

Nie ma co sie bac marshalingu, to mozna ograniczyc do zdefiniowania dwoch funkcji

http://www.codeproject.com/KB/cs/readwritestructstobinfile.aspx

nie taki diable straszny (mozna by sie klocic, czy jest to poprawne z pkt. widzenia C# i ogolnie .NET no ale jak nie jak sie inaczej nie da ... co zrobic, podobny problem z pakietami z OSI/ISO ponizej warstwy aplikacji - ten sam problem). Zalecane ladnie obudowac w biblioteke-klase co najwyzej.

//---------------
jest jeszcze jedna metoda rodem z Java, tam nie ma marshalingu (ewentualnie 3part bib) wtedy stosuje sie w cztanie do byte array i rozbicie tego w klasie (zakladajac ze klasa zajmuje tyle to i tyle bajtow, w java dochodzi jeszcze maly i duzy indianin).

0

Problemy z zapisem/odczytem/transferem danych w konkretnej-a-nie-innej binarnej postaci to spore niedopatrzenie w C# i ogólnie .Net... tak jakby twórcy uznali, że nie będzie to już potrzebne (WTF?)

0

Eh.. jako, że jestem początkujący w C# - zrobiłem całość na plikach tekstowych :/ Szybciej i łatwiej, nie mniej jednak strasznie mi się to nie podoba :/ Program był potrzebny na "wczoraj" - ale muszę się troszkę podszkolić i zrobić to za pomocą klasy Marshall.

Dziękuje za pomoc. :* :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1