Wpis z mikrobloga

#csharp #unity3d #unity #stream

Pomocy bo zaraz wyrzucę laptopa przez okno, otóż problem jest wręcz trywialny - zapisać string po stringu do pliku tekstowego.

Zapis odbywa się po osiągnięciu zwycięstwa. Po pierwszej iteracji gry wszystko bangla fajnie, jednak przy następnych wyrzuca exception. Już nie mam pojęcia gdzie może leżeć błąd i zdecydowanie zajmuje mi to więcej czasu niż powinno, błagam o pomoc...

Kod:
https://pastebin.com/E2b6GMG4

Głównie chodzi mi o konstrukcję Update() oraz saveIteration() gdzie odbywa się zapis. Z góry dziękuję za jakąkolwiek pomoc
Lacwik - #csharp #unity3d #unity #stream

Pomocy bo zaraz wyrzucę laptopa przez okn...

źródło: comment_IZqBPWNX8toKsvOE7NmGgwk1YeiREqx1.jpg

Pobierz
  • 19
  • Odpowiedz
@Lacwik: Na 90% jest problem z tym, że Streama masz cały czas otwartego. Chodzi o ten static.
Bez zagłębiania się musisz za każdym razem nowego tworzyć albo go do początku dawać.
Albo może ten StreamWriter.Close() zamyka też ten static stream i musisz go na nowo otworzyć.

Jak często zapisujesz do tego to trzymaj StreamWritera otwartego po prostu cały czas.
  • Odpowiedz
@Lacwik: tworzysz milion razy stream writera z tego samego streama, z tym że zamykasz tego stream writera po pierwszym użyciu, więc pewnie stream też ulega jakiejś "degradacji" i #!$%@? strzela każdego następnego stream writera którego próbujesz stworzysz
  • Odpowiedz
  • 0
@Lacwik nie trzymaj otwartych streamów i writerow. Używaj ich w usingach - implementuja interfejs IDisposable i będą dzięki temu zwalniane po zakończeniu scope-a nawet jak poleci exception. Żadnych staticow w pracy z zasobami zewnetrznymi.
  • Odpowiedz
@Lacwik: czemu nie zrobisz po prostu System.IO.File.AppendLine(costam)? albo File.Write(asdasd, FileMode.Append)?
czy tam File.Create(asdasd, FileMode.Append) czy jakoś tak to było
  • Odpowiedz
@mcr90 a nie robie tego właśnie? StreamWriter otwiera mi plik, zapisuje do niego wartość po czym ręcznie zamykam, chyba że czegoś nie kumam, późna godzina jest...

@nielegalny_imigrant pierwsza iteracja znowu idzie ok, przy drugiej dzieją się dzie rzeczy:
- IOException: Sharing violation on path
- ArgumentNullException: Argument cannot be null.
Parameter name: stream
  • Odpowiedz
@Lacwik: dobra jak teraz nie zadziala to czekaj na madrzejszych ode mnie :P

StreamWriter fileWriter = new StreamWriter(new FileStream("answers.txt", FileMode.Append, FileAccess.Write, FileShare.None));

a jak to nie pyknie to #!$%@? nie wiem, spróbuj jeszcze tak

StreamWriter fileWriter = new StreamWriter(new FileStream("answers.txt", FileMode.Append, FileAccess.ReadWrite, FileShare.None));
  • Odpowiedz
@nielegalny_imigrant: to na 100% zadziała jeżeli tylko za każdym razem będzie tworzył ten stream writer i go zamykał. Tylko nadal nie rozumiem - czy ręczne używanie streamów przy Unity jest naprawdę konieczne? nie bawiłem się tym nigdy, ale wydaje mi się to zbędne, strasznie toporne i bardzo na około, zwłaszcza do tak trywialnych zadań
  • Odpowiedz
@Lacwik: Skoro tak, to się trochę poczepiam:
1) Jeżeli nie zapisujesz czegoś kilka razy na sekundę albo miliona bajtów to spróbuj tak jak mówiłem - File.AppendAllText() albo AppendAllBytes czy co tam bardziej Ci pasuje.
2) Jeżeli bardzo chcesz streama to pewnie ostatnia linijka kodu od @nielegalny_imigrant powinna być ok StreamWriter fileWriter = new StreamWriter(new FileStream("answers.txt", FileMode.Append, FileAccess.ReadWrite, FileShare.None)); fileWriter.Write(asdasdasd); fileWriter.Close()
3) Zlituj się z tą pętlą for w 97 linii. Nic
  • Odpowiedz
@jaggi
2) FileMode.Append nie chce łączyć się z FileAccess.ReadWrite
4) Oczywiście że powinno sie unikać public ale chciałem to po prostu napisać na szybkości bo potrzebuje jednorazowo tych danych, by użyć ich jako spodziewanego outa perceptronu żeby miał sie jak uczyć. Potem wywalam tek kod
PS. ja również ;)
  • Odpowiedz
@nielegalny_imigrant: mi w sumie nie robi róznicy czy PascalCase czy camelCase, bardziej chodzi mi o porządek. Np. jak widzę wywołanie metody DoSth(); to wiem, że to jest publiczna metoda, a jak widzę doSth() to wiem że prywatna itd. Ale to jest w sumie kwiestia umowna. Byle by się trzymać jednej konwencji w projekcie, to jakoś bardzo mnie nie boli. Zresztą - Visual Studio 2017 pilnuje tego za mnie, bez żadnych dodatkowych
  • Odpowiedz