Gå til innhold

Anbefalte innlegg

Jeg jobber med et prosjekt som går client-serverwise, der klienten sender data til server, som serveren igjen parser. Jeg har et par spørsmål ang. selve parsingen av strings, og hvordan man får skrevet om stringen til en fil.

 

Dette er koden jeg har så langt:

 

		private void textBox1_TextChanged(object sender, EventArgs e)
	{
		char[] delimiter = { ',' };
		string[] words = textBox1.Text.Split(delimiter);
		TextWriter tw = new StreamWriter(words[0] + " vs " + words[1] + ".txt");
		foreach (string s in words)
		{
			tw.WriteLine(s);
		}
	}

 

Filen blir laget med riktig navn, men det er ingenting i den. Jeg har prøvd flere forskjellige ting, men etter flere søk i MSDN og på Google, fant jeg ut at dette var den beste måten å gjøre det på. Men som sagt, tekstfilen er tom.

 

En annen ting jeg lurer på, er hvordan jeg kan lete etter spesielle elementer i en string, f.eks. at alt som kommer mellom "$" og "," leses av som en ting, mens alt mellom "%" og "," leses av som noe annet.

 

Jeg er ikke så veldig god til å programmere enda, så noen ekstremt hightech-løsninger er ikke det jeg ser etter. ;)

 

På forhånd takk.

Lenke til kommentar
Videoannonse
Annonse

Fungerer det å bruke en int som man øker jevnt for å skrive?

 

			foreach (string s in words)
		{
			int i= 0;
			tw.WriteLine(words[i++]);
		}

 

Dette skriver heller ikke noen tekst til filen, men har dere noen annen måte å gjøre det på som fungerer?

 

 

Manfred, skjønte ikke helt hvor du ville med innlegget ditt. Jeg ser ikke helt hvordan det skal hjelpe å gjøre det sånn du skriver, i og med at jeg har et array.

Lenke til kommentar
Fungerer det å bruke en int som man øker jevnt for å skrive?

 

			foreach (string s in words)
		{
			int i= 0;
			tw.WriteLine(words[i++]);
		}

 

Dette skriver heller ikke noen tekst til filen, men har dere noen annen måte å gjøre det på som fungerer?

 

 

Manfred, skjønte ikke helt hvor du ville med innlegget ditt. Jeg ser ikke helt hvordan det skal hjelpe å gjøre det sånn du skriver, i og med at jeg har et array.

 

Din kode hadde ingen CLOSE på streamwriter objektet og innholdet i filen blir dermed ikke skrevet til filen. Tipper derfor at det eneste du hadde trengt å gjøre var å legge til en linje etter løkka di:

tw.close()

Manfreds forslagg er å innkapsle koden som skal kjøre mot streamwriter objektet. Ved å gjøre det slik som han sier så trenger du ikke instansere objektet. Du trenger heller ikke tenke på dispose for det sørger også USING for at skjer,. Kall det et nytt SCOPE om du vil.

Men når det er sagt så tror jeg heller ikke at dette forslaget hjelper deg. Sett på en CLOSE du så virker det nok.

Lenke til kommentar
{ } er alltid et nytt scope

 

en kan faktisk også bruke { } uten at det er forbundet med noe

Behold!

 

int a = 100;
{
 int b = 50;
}
// b er out of scope

 

Men det er off-topic

 

Du burde bruke regular expressions for å lese sånn tekst.

System.Text.RegularExpressions.RegEx

Sannelig. Du har helt rett. Har ikke tenkt på akkurat det før nå, men det er jo helt riktig. Oppretter man en variabel inne i { } så finnes jo ikke den på utsiden. Dette er faktisk genialt. Jeg er ikke vant til det fra Clarion for der er dette fullstendig mulig:

Kalkuler   PROCEDURE
i   INT
 code
 loop i = 1 to 100
o# += i
 End!Loop

 Message('Verdien o# er:' & o#)

Vi har eget datadeklareringsområde i Clarion, men muligheten for å bruke implisitte variabler, som # indikerer. # i dette tilfellet anntyder bare at det er LONG

 

Men poenget ditt er helt rett. Gir mange muligheter som jeg ikke er vant til.

 

/OFFTOPIC

Endret av HDSoftware
Lenke til kommentar

Poenget mitt var at man bør etterstrebe bruk av using(){}, og at ejg skjønner ikke hvorfor man skal ha en TextWriter når man kan skrive direkte med en StreamWriter. Det blir nok skrevet til filen når den closes, som det ble sagt ja, men dette vil også gjøre automatisk dersom du har et using-scope rundt den.

 

Jeg gidder ikke skrive komplett kode, jeg sparker i rett retning, så får folk ta til seg det jeg sier eller ikke.

Lenke til kommentar
Poenget mitt var at man bør etterstrebe bruk av using(){}, og at ejg skjønner ikke hvorfor man skal ha en TextWriter når man kan skrive direkte med en StreamWriter. Det blir nok skrevet til filen når den closes, som det ble sagt ja, men dette vil også gjøre automatisk dersom du har et using-scope rundt den.

 

Jeg gidder ikke skrive komplett kode, jeg sparker i rett retning, så får folk ta til seg det jeg sier eller ikke.

Jeg gjettet på at dette var ditt poeng og gjettet også på at ved å fremtvinge en DISPOSE så blei også filene lukket, men løsningn på hans problem lå i en mangel på forståelse av hvorfor det feilet.

 

Når det er sagt, hvorfor bør man etterstrebe bruken av USING? Er det fordi den sørger for DISPOSE på en skikkeligere måte en hva GCn gjør?

Lenke til kommentar

Høh, det stemmer nesten helt forbløffende, det var jeg ikke klar over.

 

	static class Program
{
	/// <summary>
	/// The main entry point for the application.
	/// </summary>
	[STAThread]
	static void Main()
	{
		using (DisposableObject obj = new DisposableObject())
		{
			obj.ShowHelloWorld();
		}

		DisposableObject dobj = new DisposableObject();
		try
		{
			dobj.ShowHelloWorld();
		}
		finally
		{
			dobj.Dispose();
		}

	}
}

 

.method private hidebysig static void  Main() cil managed
{
 .entrypoint
 .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) 
 // Code size	   46 (0x2e)
 .maxstack  1
 .locals init ([0] class IlGenTest.DisposableObject obj,
	   [1] class IlGenTest.DisposableObject dobj)
 IL_0000:  newobj	 instance void IlGenTest.DisposableObject::.ctor()
 IL_0005:  stloc.0
 .try
 {
IL_0006:  ldloc.0
IL_0007:  callvirt   instance void IlGenTest.DisposableObject::ShowHelloWorld()
IL_000c:  leave.s	IL_0018
 }  // end .try
 finally
 {
IL_000e:  ldloc.0
IL_000f:  brfalse.s  IL_0017
IL_0011:  ldloc.0
IL_0012:  callvirt   instance void [mscorlib]System.IDisposable::Dispose()
IL_0017:  endfinally
 }  // end handler
 IL_0018:  newobj	 instance void IlGenTest.DisposableObject::.ctor()
 IL_001d:  stloc.1
 .try
 {
IL_001e:  ldloc.1
IL_001f:  callvirt   instance void IlGenTest.DisposableObject::ShowHelloWorld()
IL_0024:  leave.s	IL_002d
 }  // end .try
 finally
 {
IL_0026:  ldloc.1
IL_0027:  callvirt   instance void IlGenTest.DisposableObject::Dispose()
IL_002c:  endfinally
 }  // end handler
 IL_002d:  ret
} // end of method Program::Main

Lenke til kommentar
Er ikke Clarion 16-bit?

Ja, men det har strengt tatt ingen betydning om IDE er 16, 32 eller 64 bit

Maskinkoden som genereres er optimal 32bit. Kompilatoren til Clarion er TopSpeeds kompilator som kompilerer C++, C, Clarion og Modula-2, men selve språget Clarion har ikke scope på innsiden av en prosedyre eller rutine.

 

(nesten:) Man kan selvsagt definere klasser etc. inne i en prosedyre, som vil få egne scope, men strengt tatt er en metode kunn en prosedyre i Clarion. Eneste forskjell på en metode og en prosedyre i Clarion er at det første parametere inn i prosedyren alltid er selve klassen. Dette parameteret er selvasagt gjemt for utvikleren, men dette er to ekvivalente måter å kalle metoder på i Clarion

MyObject.MyMethods(SomeParms)

MyMethod(MyObject, SomeParms)

Tror vi har Hijacket en tråd her ;-)

Endret av HDSoftware
Lenke til kommentar
hehe

 

D har nested functions også

 

Haha. Måtte jo sjekke opp. Var faktisk ikke klar over at det var noe som het D. Avart fra C++ skjønner jeg. Hvilken Eclipse plugin bruker du da? hehe - Mmrnmhrm kansje? Tøfft navn ;-) Kunne enkelt vært hentet fra en av de kule navnene i Hitchikers guide....

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...