Denna kod körs men han hoppar alldrig ur loopen.Om man kollar Visual studio med break point på if (strLine == "") så ser man att han kör X antal gånger.Men när kan har kört klar hoppar han aldrig ut ur loopen och kör kommandot return test; Hej, Du skall nog inte kolla om den är skiljt från "" utan om den är skiljt från null Ett tips. Johan, Om det är bra/snyggt att använda: Johan, din kod kommer inte att fungera Roger. André så när man rättar Johan N's små missar som .read och att readline inte heller lagrar undan värdet i en variabel så blir resultatet exakt samma kod som Johan Bovin postade innan ;) Roger J, yepp, jag är ledsen.. skulle ha lagt det i ett eget meddelande men jag har satt ett litet förtydligande nu... evighets loop?
StreamReader sr = new StreamReader(Gns, System.Text.Encoding.UTF8);
string test = "";
string strLine;
while ((strLine = sr.ReadLine()) != "")
{
// Ignore blank lines
if (strLine == "")
{
break;
}
if (strLine.Length > 0)
{
test=test + strLine;
}
else
{
break;
}
}
return test;
Sv: evighets loop?
Lite nyfiken varför du gör så här?
while ((strLine = sr.ReadLine()) != "")
och inte
while (sr.Read())
sr.Read() kommer att läsa igenom hela filen när det inte finns mer att läsa hoppar den ur.
försök även att undvika detta:
test=test + strLine;
och använd en StringBuillder med dess Append istället så får du upp hastigheten på din loop.
varje gång du gör test=test + strLine; så skapas nya objekt som fylls upp, StringBuildern ser till så
samma sträng bara utökas. Man kan tro att test=test+strLine gör samma sak men så är inte fallet.
Mvh JohanSv: evighets loop?
Vidare kan du ju kolla i dokumentationen http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemIOStreamReaderClassReadLineTopic.asp?frame=true
Edit:
Ett litet förslag baserat på Johan N's förslag nedan...
StreamReader sr = new StreamReader(Gns, System.Text.Encoding.UTF8);
StringBuilder test = new StringBuilder();
string strLine;
while (sr.Peek() >= 0)
{
strLine=sr.ReadLine();
if (strLine.Length > 0)
{
if(test.Length>0) test.Append(Environment.NewLine);
test.Append(strLine);
}
}
return test.ToString();
Sv:evighets loop?
Man bör inte göra en loop på det sättet det är kodregler ;-) nästan i alla fall.
1... Den blir olästbart för andra man måste tänkte mer för att riktigt förstå vad som händer.
2... Man bör inte ha en sådan kondition i whilen alls.
3... ett string objekt kommer att skapar vid varje while vilket kommer påverka prestandan.
Man bör helst göra:
1... nyttja någon slags bool, ex rs.Read() som kollar om det går att läsa.
2... I while scopet bör man göra justeringarna som kräver koll på "" dvs string.emtpy
Typ så här:
<code>
StreamReader sr = new StreamReader(Gns, System.Text.Encoding.UTF8);
while (sr.Read())
{...} '<--------- VAD är dett????
{
// Ignore blank lines
if(sr.ReadLine() == "")
{...} '<--------- VAD är dett????
{
break;
}
...
}
return test;
</code>
Mvh JohanSv: evighets loop?
<b><--------- VAD är dett????</b> det är när du klipper & klistrar kod på pellesoft så får du med det. Det används för att visa "folding", dvs när du minimerar ett kodblock med [-] ikonen i koden. Den "koden" ligger med i visnigen och döljs med ett style-sheet, men IE klipper med det ändå =)Sv:evighets loop?
<code>
while ((line = sr.ReadLine()) != null)
</code>
är nog upp till var och en.
Microsoft gör det iallafall i dokumentationen.
/AndrecSv: evighets loop?
sr.Read() läser en byte/tecken och stegar till nästa pos i streamen.
men eftersom du inte sparar undan det tecknet någonstanns så kommer det fattas 1 tecken per rad i den uppbyggda strängen.Sv:evighets loop?
Ja... just... skrev dock lite från huvudet ;-) tänkte Readern... Men Peek() skall man ju kolla nu när du säger det...
Mvh JohanSv: evighets loop?
"är nog upp till var och en.
Microsoft gör det iallafall i dokumentationen. "
;-)
Men vem har sagt att de skriver logisk kod i alla sina exempel? Det är bara exempel som de knappat ihop i rasande fart, inga av deras exempel är några direkt copy and paste exempel utan visar lite
hur man kan göra.
När man läser sin eller andras kod vill man använda hjärnan så lite som möjligt, detta är en god grundsten i väl självbeskrivande och bra kod enligt många och jag kan bara hålla med. Ju mindre
du måste tolka varje rad ju fortare hittar du och förstår koden och enklare blir det oxå att göra framtida
förändringar.
Se bara hur fort Roggan (Roger) såg att min kod inte skulle fungera ;-) (skämta!)
Kod är som dialekter ser oliak ut hos alla, men det finns oftast vissa sätt som är mer förstått av alla och dessa sätt är bra om man hittar. För man skriver inte bara kod för sig själv utan även för andra.
En bra bok om detta är ex Code Complete av Microsoft där de bla talar om att man inte bör göra som ovan om bättre och mer överskådliga sätt finns.
Mvh JohanSv:evighets loop?
Sv: evighets loop?
Jepp. Han la till exemplet efter mitt så det ser lite dumt ut nu efter hand... Nackdelen med att kunna editera inlägg utan att göra som andra forum kräva vad man editerade och skriva ut när ;-)
Mvh JohanSv:evighets loop?