Odpowiedniki ifstream i ofstream w C#

0

Witam, chcę przeczytać plik w C#, jednak z racji jego dużego rozmiaru nie chcę go wczytywać całego do pamięci, dowolnie po nim "skakać" i czytać/zapisywać.

Czego w tym wypadku użyć: StreamReader/Writer, czy FileReader/Writer? Może jeszcze coś innego?

1

Możesz normalnie użyć StreamReader.

0
rylek90 napisał(a)

Witam, chcę przeczytać plik w C#, jednak z racji jego dużego rozmiaru nie chcę go wczytywać całego do pamięci, dowolnie po nim "skakać" i czytać/zapisywać.

xeo545x39 napisał(a)

Możesz normalnie użyć StreamReader.

Nie do końca...

Zagadka - mamy taki konstruktor dla StreamReadera: StreamReader(Stream s);
http://msdn.microsoft.com/en-us/library/yhfzs7at.aspx
Z tego wniosek, StreamReader wewnętrznie korzysta ze streama do wykonywania operacji pisania/czytania.

Klas streamów jest dużo, nie będę się tutaj rozwodził co to są Streamy, ale na przykład mamy:
http://msdn.microsoft.com/en-us/library/system.io.pipes.pipestream.aspx - pipes
http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx - dane z sieci
http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx - dane kompresowane/dekompresowane.
Jest w stanie ktoś wymyślić sensowny sposób na "skakanie" po dowolnym z tych streamów? Hmm, niestety nie.

W takim razie, jakim cudem StreamReader działający na dowolnym streamie (wymagane jest jedynie obsługiwanie czytania) ma obsługiwać skakanie...? Niestety - nie może.

No ale... nie wszystko stracone, można oczywiście kombinować i dostawać się do podstawowego streama przez .BaseStream i używać na nim metody .Seek(). Jest to trochę brzydkie, ale może działać.

Idąc dalej, jest problem drugi - nie każdy FileStream może szukać (na przykład FileStream utworzony z uchwytu do pliku systemu operacyjnego nieobsługującego szukania). Żeby mieć zupełną pewność że kod jest poprawny, powinieneś sprawdzć czy strumień .CanSeek() przed wykonywaniem na nim swoich operacji.

Jest jeszcze trzeci problem...
Po pliku nie możesz Pisać, w dosłownym sensie. Możesz jedynie nadpisywać dane (tzn. jeśli masz plik ABCDEF, ustawisz się w środku i napiszesz XY to otrzymasz ABCXYF a nie ABCXYDEF) - jeśli o to Ci chodzi to nie ma sprawy, chciałem tylko zwrócić na to uwagę.

0

Z tego wniosek, StreamReader wewnętrznie korzysta ze streama do wykonywania operacji pisania/czytania.

StreamReader to „czytacz strumienia”, co oznacza że dane pobiera ze Streama.
Są inne “readery”: StringReader – ze stringa, BinaryReader – ze Streama ale dane binarne.

Zainteresuj się też klasami File i FileStream.

http://msdn.microsoft.com/en-us/library/29kt2zfk.aspx

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