C# filekezelés.

Ez a téma lezárásra került a moderátor által. A lezárás oka: A Tudástárban egy téma – egy kérdés/probléma érvényesül.
C# filekezelés.
2017-10-10T18:15:42+02:00
2017-10-22T16:44:18+02:00
2022-12-04T20:40:41+01:00
dafield
Sziasztok, előre is elnézést szeretnék kérni,  mert kezdő vagyok.
Előző tanévbe tanultam C# programozást(többé kevésbé), viszont a filekezeléssel gondjaim vannak.
Idén mennék emelt érettségizni és némi segítségre lenne szükségem, mert próbáltam csinálni emelt érettségis feladatokat, viszont a file beolvással többször is voltak gondjaim,mert csak össze-vissza vettük(Néztem interneten/youtuben megoldásokat de ott is mindig másféleképpen láttam).Ezeket úgy tanultuk, hogy vagy classba vagy struktúrába adunk értékeket és azt később egy tömbbe bele rakjuk.Az lenne a kérdésem hogy valaki tudna egy kicsit segíteni abban, hogy melyik szituációban melyik módszert érdemes használni? Úgy értem például mit használjak ha csak számokból áll a txt vagy csak stringből, esetleg mindkettőből? Esetleg van olyan opció hogy például minden esetben csak classba vagy csak mindig struktúrába csináljam meg? És akkor ahhoz az 1 bevált módszerre tudnék támaszkodni.
Példaképpen itt van a tavaly októberi feladat beolvasás része:https://pastebin.com/Psd6tKdB
Előre is köszönöm ha valaki tud segíteni, az életemet menti meg.
Mutasd a teljes hozzászólást!
Megnéztem a belinkelt kódodat. Szerintem a problémád alapvetően nem strukt használatából adódik, hanem a fájl feldolgozást értelmezed hibásan. A fájlod ez esetben úgy van felépítve, hogy az első sorában a helyes választ tárolták le. Az első sort követő sorokban egy egy versenyző azonosítója és a versenyző válasza van letárolva. Nyilván jó lehet többféle megoldás is, de én csak az azonosítót 
és a versenyző válaszát tárolnám példány szintű mezőkben. Az átalakított kódban benne hagytam a helyes választ is, de azt egy osztály szintű (statikus) mezőbe tárolom el egyszer.

Javaslom ha ilyen jellegű input fájlal találkozol egy feladatban, akkor célszerű azon adatokat külön feldolgozni, aminek jelentése tartalma szerkezete el tér a többitől.  A példa input fájl első sorában a helyes válasz van a többi sorban  egyegy versenyző adatai szóközzel elválasztva.  (Itt azonnal látszik hogy az első sor különböző a többitől). A kódban láthatod majd, hogy ezt úgy oldottam meg, hogy egy sort beolvastam a cikluson kívül, és fel is dolgoztam. a beolvasott tartalmat.  

string megoldas = sr.ReadLine(); Kviz.helyes_valasz = megoldas;
Így mire a ciklusba beléptem addigra a ciklusban lévő sr.ReadLine(); már a második sort fogja beolvasni a fájlból, ami egy versenyzőre vonatkozó adatot tartalmaz, ez már mehet egy struct példányba majd a tömbbe.

while (!sr.EndOfStream) { string s = sr.ReadLine(); string[] sor = s.Split(' ');//Ez az utasítás az egy sornyi adatot felbontja a szóköz meentén AB123 BXCDBBACACADBC-> sor[0]="AB123" és sor[1]="BXCDBBACACADBC" k[x].vazon = sor[0]; // a fájl második sorának beolvasása esetén sor[0] = "AB123" k[x].valasz = sor[1];// a fájl második sorának beolvasása esetén sor[1] = "BXCDBBACACADBC" x++; }

Amit még hibáztál azaz volt, hogy a ciklus magjában több sort is beolvastál egyszerre, és azokat próbáltad volna a struct példányba betölteni.
De a feladat valószínűleg nem ezt kérte, és valószínűleg te sem ezt így szeretted volna csinálni.

while (!sr.EndOfStream) { string s = sr.ReadLine();//itt beolvasol egy sort ez a helyes megoldást tartalmazta a ciklus első lépésében a második lépésben itt is egy versenyző teljes adatsora lesz beolvasva string[] sor = s.Split(' '); k[x].megoldas = sor[0];// ide valóban bekerülne a helyes megoldás a ciklus mag első végrehajtása során, már a második lépés során egy versenyző teljes sorát olvasod be k[x].vazon = sr.ReadLine(); //itt beolvasol egy új sort, de ez a következő versenyződ teljes adat sora k[x].valasz = sr.ReadLine();// itt beolvasol egy újabb sort, ez is egy következő versenyződ teljes adat sora x++; }
Alább bemásolom a módosított kódot:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace _2017beolvas { /* Pár sor példának(első sor az a megoldás ami csak 1x szükséges a többi a versenyző azonosítóját jelenti és a másik 14 betű meg a válaszát. BCCCDBBBBCDAAA AB123 BXCDBBACACADBC AH97 BCACDBDDBCBBCA */ class Program { struct Kviz { static public string helyes_valasz; public string vazon; public string valasz; } static void Main(string[] args) { Kviz[] k = new Kviz[1000]; int x = 0; FileStream fs = new FileStream(@"c:\!atm\valaszok.txt", FileMode.Open); StreamReader sr = new StreamReader(fs, Encoding.UTF8); //Első sort beolvasom a fájlból, ami a megoldást tartalmazza string megoldas = sr.ReadLine(); Kviz.helyes_valasz = megoldas; //Feldolgozom a fájl többi részét, amely a tanulók eredményet tartalmazza while (!sr.EndOfStream) { string s = sr.ReadLine(); string[] sor = s.Split(' ');//Ez az utasítás az egy sornyi adatot felbontja a szóköz meentén AB123 BXCDBBACACADBC-> sor[0]="AB123" és sor[1]="BXCDBBACACADBC" k[x].vazon = sor[0]; // a fájl második sorának beolvasása esetén sor[0] = "AB123" k[x].valasz = sor[1];// a fájl második sorának beolvasása esetén sor[1] = "BXCDBBACACADBC" x++; } Array.Resize(ref k, x); fs.Close(); sr.Close(); /*foreach (var item in k) { Console.WriteLine(item.megoldas); Console.WriteLine("+"); break; }*/ Console.WriteLine("A helyes válasz:{0}",megoldas); Console.WriteLine("+"); foreach (var item in k) { Console.WriteLine("{0}. azonosítójú versenyző válasza:{1} a helyes válasz:{2}", item.vazon,item.valasz,Kviz.helyes_valasz); } Console.WriteLine("Ennyi versenyző vett részt:{0}", k.Length);//k.Length visszaadja a versenyzok adatait tároló tömb méretét ami megegyezik a versenyzők számával Console.Write("Kérek egy versenyző azonosítót:"); string azon = Console.ReadLine(); for (int i = 0; i < k.Length; i++) { if (azon == k.vazon) { Console.WriteLine("Megtaláltam a keresett azonosítójú versenyzőt {0}.sorban",i+1); } } Console.ReadKey(); } } }
Mutasd a teljes hozzászólást!

  • Lényegében az osztály és a struktúra típus sok mindenben hasonlít egymásra, ezért sokszor valóban nehéz eldönteni melyiket is használjuk.
    Véleményem szerint az érettségi szintű feladatok esetében szinte mindegy lenne melyik típust választod a feladat megoldásához. 

    Persze a hasonlóságok mellett van néhány különbség is. Egyik ilyen különbség például az, hogy struktúra nem örököltethető. Ha a feladat megoldása öröklődéssel létrejövő hierarchiát igényelne, akkor az osztályt lenne célszerű választani a feladat megoldásához.

    Amikor nem csak a feladat sikeres megoldására törekszünk, hanem hatékonysági szempontoknak is meg szeretnénk felelni, akkor már valóban nem mindegy, hogy melyik nyelvi elemet választjuk a feladatunk megvalósításához. Talán az egyik legfőbb különbség az osztály és a struktúra között az, hogy a struktúra érték típusként, az osztály referencia típusként tárolja az adatait.  A teljesség igénye nélkül a .Net a referencia típusok példányait a heap memória területen tárolja, ahonnét a már fölösleges nem használt példányokat, az úgynevezett szemétgyűjtő eljárás (garbage collector) takarítja ki időnként. Az hogy ez a memória takarítási folyamat mikor is történik meg, arra a fejlesztőnek nem sok ráhatása van. (Egy kezdő fejlesztő valószínűleg nem is nagyon foglalkozik  ezzel a probléma körrel, mert úgy gondolja rengeteg memória van a számítógépben.) Ezzel ellentétben az érték típusok a veremben (stack) tárolódnak, és élettartamuk addig tart amíg a hatókörük. Például, ha egy függvényben struktúrát használnunk, ami érték típusként tárolja az adatokat, melynek hatóköre a függvény elejétől a végéig tart, ez esetben a függvény végrehajtását követően a veremből azonnal felszabadulna a memória (Ez esetben már a fejlesztőnek is van ráhatása a memória kezelésre). Ezért is költséghatékonyabb értéktípussal dolgozni, mint referencia típussal, azaz hatékonyság szempontjából a struktúra jobb választás. Persze csak, akkor ha nem kerül sor a feldolgozás során úgynevezett becsomagolásra (boxolásra) . Azaz, ha az értéktípusunkat nem kell referencia típussá alakítani, mert ez esetben az osztály, mint referencia típus mégis jobb választás lenne.
    Mutasd a teljes hozzászólást!
  • Szia. Nem vagyok egy profi C# programozó, viszont én is most készülök emelt szintű érettségire májusban. A pastebines linken amit küldtél amikor próbáltad struktúrával megoldani, az szerintem a miatt van mivel a Program osztályon belül akartál létrehozni egy struktúrát. Az osztályokat, struktúrákat a meglévők alá/fölé kell létrehozni. (Egyébként jelenleg prog. órán az érettségi feladatokat kezdtem el csinálgatni visszafele, pont ennél tartok én is :D)

    Viszont, nem értem hogy miért jobb ha FileStreammal együtt van létrehozva a StreamReader? Én mindig csak simán a StreamReadert használtam és egy tanárom sem szólt pedig mindegyik programozó informatikus szakon végzett. Esetleg egy tapasztaltabb programozó ha tudna rá választ adni, megköszönönném!

    Valamint, szerintem érettségin próbálj meg rövid de beszédes változóneveket adni. Látom hogy a while ciklusodban index néven nevezted el a számláló változódat, lehet nem sok tized másodpercet számít de egy 'i' betűt gyorsabb leírni mint hogy 'index'

    Nem tudom a prog. tanárod milyen elvben tanította a programozást, de nálunk mindig is amellett volt a tanár hogy az objektumokat(struktúrákból,osztályokból) inkább listával szedjük össze, hiszen listák sokkal kezelhetőbbek, ésszerűbbek a tömböknél ilyen objektumos környezetben. Egy gyors példa rá: Létrehozol egy ezres méretű tömböt, majd miután lefutott a ciklus, beolvasta a fájlt akkor Array.Resize metódussal lecsökkented a tömb méretét. Ez eléggé érdekesnek tünik. 
    Ehelyett célszerűbb lenne egy listát létrehozni: List<Hivasok> lista = new List<Hivasok>();
    És a while cikluson belül mindig létrehozni egy hivas változót: Hivasok hivas = new Hivasok();
    És ezután simán: lista.Add(hivas);

    Azt javaslom még, hogy minden struktúra vagy osztály nevét egyes számban adj meg, hiszen elég érdekesen hangzik ha több Hívások objektumból hozol létre egy Hívások listát. Olyan mintha a sima objektumban már több hívás lenne. Ez nem kötelező, csak tanács.

    Remélem tudtam segíteni valamit, sok szerencsét az érettségihez :)
    ui: (SQL,Webszerkesztésre gyakorolj sok pontot számít)
    Mutasd a teljes hozzászólást!
  • Viszont, nem értem hogy miért jobb ha FileStreammal együtt van létrehozva a StreamReader? 

    Azt nem tudom megítélni, hogy jobb-e vagy sem, ha magad hozod létre a FileStreamet, és azt adod át paraméterként a StreamReadernek. De ha te hozod létre a streamet, akkor illik felkészülni a hibakezelésre, és nem megfeledkezni a Filestream lezárásáról sem.  
    Ha a fájl elérési úttal paraméterezed a StreamReadert, akkor a StreamReader a paraméter listájára illeszkedő konstruktorában fogja létrehozni a Streamet. 

    Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, DefaultFileStreamBufferSize, FileOptions.SequentialScan, Path.GetFileName(path), false, false, checkHost);
    Mutasd a teljes hozzászólást!
  • Emberek most kezdtem el az idei májusi emeltet feladatokat megcsinálni és most látom hogy beolvassa  szöveget de a verseny azonosítóját és a választ ugyanannak veszi szóval az egyik feladatba ha bekérek egy azonosítót és azt iffel kiíratom teljesen más jön ki, esetleg valaki ki tudna  engem valaki egy kicsit segíteni vagy tudna mutatni valami olyan beolvasást ami akkor is jó ha string és int vegyesen kell?
    Mutasd a teljes hozzászólást!
  • Például:

    List<Hivas> lista = new List<Hivas>(); StreamReader reader = new StreamReader("fájlnév.txt"); while(!reader.EndOfStream){ string line = reader.ReadLine(); string[] sor = line.Split(' '); Hivas hivas = new Hivas(); hivas.kezdet = Convert.ToInt32(sor[0]); hivas.veg = Convert.ToInt32(sor[1]); hivas.leiras = sor[2]; } reader.Close();
    Viszont, a prog. tanárom álláspontja szerint OOP álláspont szerint minden műveletet a lehető legkisebb részre kell feldarabolni, hiszen ilyenkor bármi módosítást könnyebben lehet elvégezni.

    Szóval:

    public List<Hivas> Fajlolvasas(string fajlnev){ List<Hivas> lista = new List<Hivas>(); StreamReader reader = new StreamReader(); while(!reader.EndOfStream){ string sor = reader.ReadLine(); Hivas hivas = Sorfeldolgozas(sor); lista.Add(hivas); } return lista; } public Hivas Sorfeldolgozas(string sor){ Hivas hivas = new Hivas(); string[] split = sor.Split(' '); hivas.kezdet = Convert.ToInt32(split[0]); hivas.veg = Convert.ToInt32(split[1]); hivas.leiras = split[2]; return hivas; }
    Ezek ugye nem felelnek meg a jelenlegi szerkezetnek, csak példa szempontjából.
    Mutasd a teljes hozzászólást!
  • Áhh, így már világos! Gondolom vannak olyan helyzetek ahol létrehozva kell/jobb használni van pedig ahol nem. Köszönöm!
    Mutasd a teljes hozzászólást!
  • Lehet én vagyok az ügyetlen de például ez a  return lista miért kell bele? Csak akkor tölti fel a listád?
    Egyébként melyiket javasoljátok feladatok megoldásához ha nem a hatékonyság hanem az egyszerűség,érthetőség a cél? (struktúra/class lista/tömb)
    Mutasd a teljes hozzászólást!
  • public List<Hivas> Fajlolvasas(string fajlnev){ List<Hivas> lista = new List<Hivas>(); StreamReader reader = new StreamReader(); while(!reader.EndOfStream){ string sor = reader.ReadLine(); Hivas hivas = Sorfeldolgozas(sor); lista.Add(hivas); } return lista; }

    Easy987 bemutatta neked, hogyan lehet a feladatot részfeladatokra bontva függvényeket alkalmazva megoldani. Bár a példakód részletből nem látszik, de mivel publikus láthatóságot állított be a függvénynek, így feltételezhető, hogy a fájl beolvasást egy erre a feladatra tervezett önálló osztályban valósítaná meg. Ha nem ez volt a terv, akkor elég lett volna a private láthatóság is.

    A példa kódban a  lista változó a függvény egy lokális változója, így a hatásköre a  függvény belsejére korlátozódik (a függvényen kívül a tartalma nem elérhető). Mivel dolgozni akarsz  a beolvasott adatokkal program más részeiben is, például main metódusában,  így vissza kell adni egy a lista változó memória helyére mutató referenciát. Ezt teszi meg a return lista; utasítással
    És valahogy a következő módon hívnád meg. 

    Lista<hivas> bejovoHivasok = Fajlolvasas("hivasok.txt");
    Lehet én vagyok az ügyetlen de például ez a return lista miért kell bele? Csak akkor tölti fel a listád?

    A kérdésedre a válasz. A függvény a lista változóba betölti  a fájlból az adatokat, de a függvényen kívül nem tudnád további feldolgozás céljából felhasználni, mert a lista változód a Fajlolvasas függvényen kívül nem elérhető.

    Egyébként melyiket javasoljátok feladatok megoldásához ha nem a hatékonyság hanem az egyszerűség,érthetőség a cél? (struktúra/class lista/tömb)

    Hatékonyságot figyelmen kívül hagyva, illetve az érettségi feladatok elvárásait is figyelembe véve szinte mindegy, hogy struct-ot, vagy class-t használod a programodban.
    Lista vagy tömb kérdésében az segíthet, hogy ismert-e a feldolgozandó adatok számossága. A feladat leírásokból általában úgy szokott ez kiderülni, hogy ilyet olvasol például, hogy az input fájl első sorában a leírás szerint a feldolgozandó adatok számossága van letárolva.
    Azaz, ha ismert a beolvasandó adatok számossága, akkor a tömb is jó választás, mert az input fájlból beolvasott érték alapján deklarálható a tömb mérete egy változó alkalmazásával. Ha nem adják meg a számosságot, akkor válaszd a listát. És ahogy azt már Easy987 is említette a lista természetesen mind a két esetben használható.  Ha a beolvasandó adatok számossága ismert, és mégis a listát választanád, akkor a beolvasást során javasolnám, hogy a while ciklus helyett esetleg for ciklust használj. így látni fogja a feladatot értékelő tanár, hogy a számosságra vonatkozó értéket is beolvastad, és fel is használtad. (De az is lehet, hogy ez nem szempontja az értékelésnek, mert a végeredmény enélkül is lehet helyes.)
    Mutasd a teljes hozzászólást!
  • Figyu, ahogy néztem a struktúrát jobban értem de például a 2017es feladatsorban volt egy kis problémám, beolvasta a dolgot meg ki is írja a képernyőre de ahogy elkezdtem csinálni azt vettem észre hogy nem úgy kezeli le a dolgot ahogy nekem jó lenne. Csináltam magamtól gyakorlásra pár txt-t mixelve a string és int típusokat meg csináltam még a 2015ös meg a vigenere(2005ös) érettségi feladatsort azoknál nem ütköztem ebbe a problémakörbe. Ha jól sejtem itt az a baj egy sorba 2 "Típusom" is van a "vazon" és a "valasz" is.
    Itt a forráskód esetleg ha valaki lenne kedves ki tudna engem ebben javítani?
     [C#] 2017instruct - Pastebin.com
    Mutasd a teljes hozzászólást!
  • A pastebines linken amit küldtél, nekem elsőnek ismét az tűnik fel hogy a struktúrádat az osztályodon belül hozod létre. Nem tudom hogy ezt így elfogadja-e a fordító/környezet vagy sem de fura.

    Másodszor: A fájl beolvasásakor az s változóba eltárolod azt az egy sort, azzal kezdessz valamit és folytatódik a ciklus a fájl utolsó soráig. Az s változót ezután feldarabolod szóközönként, és a megoldas értékét beállítod a szétdarabolt tömb nulladik elemének az értékére.
    Ezután a többi értéknél ugye stringre van szükséged, viszont ilyenkor ha mégegyszer vagy többször lefuttatod a ReadLine parancsot akkor mindig annyiszor több sort fog beolvasni.
    Ilyenkor a már feldarabolt string tömbbödben lévő értékekkel kell beállítani sorrendben.
    Szóval:

    FileStream fs = new FileStream("valaszok.txt", FileMode.Open); StreamReader sr = new StreamReader(fs, Encoding.UTF8); while (!sr.EndOfStream) { string s = sr.ReadLine(); string[] sor = s.Split(' '); k[x].megoldas = sor[0]; k[x].vazon = sor[1]; k[x].valasz = sor[2]; x++; }
    Még egy észrevétel: Én ezt az érettségi feladatot már megoldottam, célszerűbb ha egy külön változót hozol létre az osztályodon belül pl. static string helyes_valaszok;
    És amikor feldolgozod a fájlt, akkor a while cikluson kívül csinálsz egy ilyet:

    helyes_valaszok = sr.ReadLine();
    Ilyenkor beolvassa a fájl első sorát és a ciklusod már a 2. sortól fog indulni és így az adatstruktúrádban nem lesz oda nem illő adat.
    Mutasd a teljes hozzászólást!
  • Megnéztem a belinkelt kódodat. Szerintem a problémád alapvetően nem strukt használatából adódik, hanem a fájl feldolgozást értelmezed hibásan. A fájlod ez esetben úgy van felépítve, hogy az első sorában a helyes választ tárolták le. Az első sort követő sorokban egy egy versenyző azonosítója és a versenyző válasza van letárolva. Nyilván jó lehet többféle megoldás is, de én csak az azonosítót 
    és a versenyző válaszát tárolnám példány szintű mezőkben. Az átalakított kódban benne hagytam a helyes választ is, de azt egy osztály szintű (statikus) mezőbe tárolom el egyszer.

    Javaslom ha ilyen jellegű input fájlal találkozol egy feladatban, akkor célszerű azon adatokat külön feldolgozni, aminek jelentése tartalma szerkezete el tér a többitől.  A példa input fájl első sorában a helyes válasz van a többi sorban  egyegy versenyző adatai szóközzel elválasztva.  (Itt azonnal látszik hogy az első sor különböző a többitől). A kódban láthatod majd, hogy ezt úgy oldottam meg, hogy egy sort beolvastam a cikluson kívül, és fel is dolgoztam. a beolvasott tartalmat.  

    string megoldas = sr.ReadLine(); Kviz.helyes_valasz = megoldas;
    Így mire a ciklusba beléptem addigra a ciklusban lévő sr.ReadLine(); már a második sort fogja beolvasni a fájlból, ami egy versenyzőre vonatkozó adatot tartalmaz, ez már mehet egy struct példányba majd a tömbbe.

    while (!sr.EndOfStream) { string s = sr.ReadLine(); string[] sor = s.Split(' ');//Ez az utasítás az egy sornyi adatot felbontja a szóköz meentén AB123 BXCDBBACACADBC-> sor[0]="AB123" és sor[1]="BXCDBBACACADBC" k[x].vazon = sor[0]; // a fájl második sorának beolvasása esetén sor[0] = "AB123" k[x].valasz = sor[1];// a fájl második sorának beolvasása esetén sor[1] = "BXCDBBACACADBC" x++; }

    Amit még hibáztál azaz volt, hogy a ciklus magjában több sort is beolvastál egyszerre, és azokat próbáltad volna a struct példányba betölteni.
    De a feladat valószínűleg nem ezt kérte, és valószínűleg te sem ezt így szeretted volna csinálni.

    while (!sr.EndOfStream) { string s = sr.ReadLine();//itt beolvasol egy sort ez a helyes megoldást tartalmazta a ciklus első lépésében a második lépésben itt is egy versenyző teljes adatsora lesz beolvasva string[] sor = s.Split(' '); k[x].megoldas = sor[0];// ide valóban bekerülne a helyes megoldás a ciklus mag első végrehajtása során, már a második lépés során egy versenyző teljes sorát olvasod be k[x].vazon = sr.ReadLine(); //itt beolvasol egy új sort, de ez a következő versenyződ teljes adat sora k[x].valasz = sr.ReadLine();// itt beolvasol egy újabb sort, ez is egy következő versenyződ teljes adat sora x++; }
    Alább bemásolom a módosított kódot:

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace _2017beolvas { /* Pár sor példának(első sor az a megoldás ami csak 1x szükséges a többi a versenyző azonosítóját jelenti és a másik 14 betű meg a válaszát. BCCCDBBBBCDAAA AB123 BXCDBBACACADBC AH97 BCACDBDDBCBBCA */ class Program { struct Kviz { static public string helyes_valasz; public string vazon; public string valasz; } static void Main(string[] args) { Kviz[] k = new Kviz[1000]; int x = 0; FileStream fs = new FileStream(@"c:\!atm\valaszok.txt", FileMode.Open); StreamReader sr = new StreamReader(fs, Encoding.UTF8); //Első sort beolvasom a fájlból, ami a megoldást tartalmazza string megoldas = sr.ReadLine(); Kviz.helyes_valasz = megoldas; //Feldolgozom a fájl többi részét, amely a tanulók eredményet tartalmazza while (!sr.EndOfStream) { string s = sr.ReadLine(); string[] sor = s.Split(' ');//Ez az utasítás az egy sornyi adatot felbontja a szóköz meentén AB123 BXCDBBACACADBC-> sor[0]="AB123" és sor[1]="BXCDBBACACADBC" k[x].vazon = sor[0]; // a fájl második sorának beolvasása esetén sor[0] = "AB123" k[x].valasz = sor[1];// a fájl második sorának beolvasása esetén sor[1] = "BXCDBBACACADBC" x++; } Array.Resize(ref k, x); fs.Close(); sr.Close(); /*foreach (var item in k) { Console.WriteLine(item.megoldas); Console.WriteLine("+"); break; }*/ Console.WriteLine("A helyes válasz:{0}",megoldas); Console.WriteLine("+"); foreach (var item in k) { Console.WriteLine("{0}. azonosítójú versenyző válasza:{1} a helyes válasz:{2}", item.vazon,item.valasz,Kviz.helyes_valasz); } Console.WriteLine("Ennyi versenyző vett részt:{0}", k.Length);//k.Length visszaadja a versenyzok adatait tároló tömb méretét ami megegyezik a versenyzők számával Console.Write("Kérek egy versenyző azonosítót:"); string azon = Console.ReadLine(); for (int i = 0; i < k.Length; i++) { if (azon == k.vazon) { Console.WriteLine("Megtaláltam a keresett azonosítójú versenyzőt {0}.sorban",i+1); } } Console.ReadKey(); } } }
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen!
    Viszont hogyha egy sorban csak egy ilyen a struktúrában felül public string "valamim" van akkor az a  módszer is jó amit belinkeltem ugye?
    Egyébként tényleg köszönöm hogy észrevetted a "módszerem" és annak megfelelően javítottál ki és nem valami teljesen mást mutattál amit nem értek még ennyire se!
    Jah igen és az alapértelmezett classon belül szoktam csinálni a struktúrát ha most nem ott volt akkor csak figyelmetlen voltam.
    Mutasd a teljes hozzászólást!
  • Nem biztos, hogy az a jó megoldás amit megszoksz :)
    Mutasd a teljes hozzászólást!
  • Természetesen publikus mezővel is megoldható, a fájl beolvasásodat akkor is módosítanod kell mert a helyes megoldás ez esetben csak a fájl első sorában szerepelt. Alább a beillesztem a publikus mezőt használó kódot. Nézd meg miben különbözik az előzőtől.

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace _2017beolvas { /* Pár sor példának(első sor az a megoldás ami csak 1x szükséges a többi a versenyző azonosítóját jelenti és a másik 14 betű meg a válaszát. BCCCDBBBBCDAAA AB123 BXCDBBACACADBC AH97 BCACDBDDBCBBCA */ class Program { struct Kviz { public string helyes_valasz; public string vazon; public string valasz; } static void Main(string[] args) { Kviz[] k = new Kviz[1000]; int x = 0; FileStream fs = new FileStream("valaszok.txt", FileMode.Open); StreamReader sr = new StreamReader(fs, Encoding.UTF8); //Első sort beolvasom a fájlból, ami a megoldást tartalmazza string megoldas = sr.ReadLine(); //Kviz.helyes_valasz = megoldas; //Feldolgozom a fájl többi részét, amely a tanulók eredményet tartalmazza while (!sr.EndOfStream) { string s = sr.ReadLine(); string[] sor = s.Split(' ');//Ez az utasítás az egy sornyi adatot felbontja a szóköz meentén AB123 BXCDBBACACADBC-> sor[0]="AB123" és sor[1]="BXCDBBACACADBC" k[x].vazon = sor[0]; // a fájl második sorának beolvasása esetén sor[0] = "AB123" k[x].valasz = sor[1];// a fájl második sorának beolvasása esetén sor[1] = "BXCDBBACACADBC" k[x].helyes_valasz = megoldas; x++; } Array.Resize(ref k, x); fs.Close(); sr.Close(); /*foreach (var item in k) { Console.WriteLine(item.megoldas); Console.WriteLine("+"); break; }*/ Console.WriteLine("A helyes válasz:{0}",megoldas); Console.WriteLine("+"); foreach (var item in k) { Console.WriteLine("{0}. azonosítójú versenyző válasza:{1} a helyes válasz:{2}", item.vazon,item.valasz,item.helyes_valasz/*Kviz.helyes_valasz*/); } Console.WriteLine("Ennyi versenyző vett részt:{0}", k.Length);//k.Length visszaadja a versenyzok adatait tároló tömb méretét ami megegyezik a versenyzők számával Console.Write("Kérek egy versenyző azonosítót:"); string azon = Console.ReadLine(); for (int i = 0; i < k.Length; i++) { if (azon == k.vazon) { Console.WriteLine("Megtaláltam a keresett azonosítójú versenyzőt {0}.sorban",i+1); } } Console.ReadKey(); } } }
    Mutasd a teljes hozzászólást!
  • Köszönök mindent, majd még megcsinálok pár feladatsort ha van valami kiírom hogy sikerült, utólag meg előre meg mindenhogy köszönöm,már sokkal tisztább a dolog.
    Mutasd a teljes hozzászólást!
  • Sziasztok kellene megint egy kis segítség, a 2014es októberi programozás feladatnál a beolvasási része ha jól értelmeztem úgy kellene csinálni hogy  mindkét txt két külön stringes mátrixba kellene olvasni,mert sor és helyszámra kérdez rá a feladat.
    Az alábbi linken van a próbálkozásom de az teljesen hibás, ezt csak File.ReadAllLines-al tudom beolvasni hiba nélkül de azzal meg az a baj hogy nem tudok sor és helyszámra hivatkozni.
    Ha valaki megint tud segíteni előre köszönöm,remélem nem ilyet fogok kapni, mert a többivel már rendbe vagyok, ahol nem kell mátrixba olvasni lehet hogy itt se kell csak elsőnek így arra gondolnék.
    Ezeket kellene beolvasni ez 2 külön txt. xxoxoxoxoxoxooxxxxox xxxxxxxxxxxxxx - Pastebin.com
    Mutasd a teljes hozzászólást!
Ez a téma lezárásra került a moderátor által. A lezárás oka: A Tudástárban egy téma – egy kérdés/probléma érvényesül.
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd