Eléggé kezdő vagyok összeségében nem csak C#-ban, hanem úgy programozás terén is, de nem igazán értem mi a baj a kódommal?
Szóval azt a feladatot kaptuk, hogy egy szöveges állományból olvassunk be adatokat, és végezzünk el rajta egy pár lekérdezést, pl. egy felhasználó által kiválasztott sportoló hány kilómétert fog futni a héten, meg hogy mennyi a kerékpáron teljesítendő táv összesen az adott héten. Ezekkel nincs probléma, már megírtam rá a meetódusokat, de a beolvasással van egy kis problémám.
A szöveges fájlt így kell elképzelni:
@Kiss_József#Futás!Szerda:14
@Nagy_Imre#Úszás!Kedd:12
@Kiss_József#Úszás!Kedd:6
Mivel ki kell iratni is az egész állományt a képernyöre a következő formátumban:
Név: Kiss József; sportág: futás; nap: szerda; táv: 14
ezért arra gondoltam, hogy úgy olvasom be az adatokat, hogy 4 külön tömböt generálok (név, sportág, nap, táv)
amikben eleve már a helyes formátumban tárolok minden adatot (tehát a névtömbben a @ és _ jel nélkül,
és ugyanígy a többiben. A gond az, hogy a következő kódban futásidejő hiba keletkezik:
static string [] NameArrayGen (string [] fulltext)
{
string [] namearray=new string [fulltext.Length];
int atpos=0;
string line;
for (int i = 0; i < fulltext.Length; i++)
{
line = fulltext[i];
Console.WriteLine(line);
for (int j = 0; j <line.Length; j++) //A LINE.LENGTHNÉL EZT ÍRJA: Object reference not set to an instance of an object.
if (j == '@')
atpos++;
line = line.Remove(atpos, 1);
line = line.Replace("_", " ");
int k = 0;
while (line [k]!='#')
{
namearray[k] = line;
k++;
}
}
return namearray;
}
Szóval nem értem mi a baj, mert tulképp csak anyit csinálok, hogy a line-nal beállítom, hogy mindid az egész beolasott szöveg aktuélis sora legyen, ami ugyebár string típusú, és a line.Length-el a hosszát kérdezem le. Miért nem engedi ezt?
Nagyon sürgős lenne, mert kedden zh-t írunk, és mindig ilyesmi problémába ütközök, fájlbeolvasáskor.
A fulltext tömbödben van egy null értékű elem is.
Másolt be az a kódrészt is, ahol meghívod a NameArrayGen metódust, ott lesz a probléma!
továbbá:
if (j == '@')
A j egy ciklusváltozó, ne azt használd, hanem a line j-edik karakterét.
Még a kirató függvény (ami most csak a névtömböt írja ki a többi adatot nem):
static void EditedToDisp(string[] namearray)
{
for (int i = 0; i < namearray.Length; i++)
Console.WriteLine("Név: {0}", namearray[i]);
}
és a hívás:
EditedToDisp(NameArrayGen(FileOpen("sport.txt")));
Ja és persze a fájlmegnyitó metódust lefelejtettem. Az pedig így néz ki:
static string[] FileOpen(string filename)
{
string[] fulltext = new string[100];
string line = "";
StreamReader sr = new StreamReader(filename);
int i = 0;
while (!sr.EndOfStream)
{
line = sr.ReadLine();
fulltext[i] = line;
i++;
}
return fulltext;
}
Lehet hogy ebben nyitottam meg eleve rosszul a fájlt?
Az olvasó függvény helyett logikusabb lenne: [link]
Aztán a sorokat csak Split-elni kell. [link]
Például:
string s = "@Kiss_József#Úszás!Kedd:6";
string[] split = s.Split(new char[] { '@', '#', '!', ':' }, StringSplitOptions.RemoveEmptyEntries);
és így a "split" tömbben egymás után benne lesznek az adatok.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!