Toon posts:

[C#] read & write a file

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik wil een functie schrijven (in MS Visual Studio .NET) die een bepaalde string mee krijg en een regelnummer.
De functie moet dan een bestand openen en de betreffende string op de regel zetten van de regelnummer. De regel die in het bestand op die regel stond moet verwijderd worden.

Om te kunnen lezen & schrijven moet ik gebruik maken van FileStream, maar filestream bevat geen mogelijkheid voor "getline" of "writeline".
oftewel het lezen/schrijven van een volledige regel in 1 keer.

StreamReader en StreamWriter hebben dit wel.

Hoe moet ik de functies getline en writeline namaken met behulp van FileStream?
OF
kan een andere class gebruiken dan FileStream die beide functies toestaat?
zo ja, welke?

ps : De search van GOT werk al niet vanaf 07:10 :S
en de msdn heb ik ook al gebrobeerd, daar heb ik filestream, streamreader en streamwriter vandaan.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

Splitsen op Environment.Newline?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 26-05 23:32
Je kan je FileStream als 'base-stream' gebruiken voor je StreamReader / StreamWriter

Het probleem is wel -denk ik, ik heb het zelf nog niet gedaan- dat je je file sekwentieel zult moeten benaderen; dwz dat je dus, als je regel 3 wilt uitlezen, eerst regel 1 en regel 2 zult moeten lezen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
wat moet ik Splitsen op Environment.Newline?
ietsje meer uitleg zou fijn zijn, want ik snap niet hoe dat je het bedoelt.

en hoe moet ik FileStream als 'base-stream' gebruiken voor m'n StreamReader / StreamWriter ??

Het maakt niet uit dat ik het bestand Sequentieel moet benaderen. Daar is wel mee te leven.

  • whoami
  • Registratie: December 2000
  • Laatst online: 26-05 23:32
Kijk eens naar de constructor van StreamWriter of StreamWriter.

Zo dus:
code:
1
StreamWriter sw = new StreamWriter(myFileStream);

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op deze manier gebruik je gewoon StreamWriter.

code:
1
StreamWriter sw = new StreamWriter(myFileStream);


Dit declareert een variabele met de naam 'sw' van het type StreamWriter.
en hiermee kan je ALLEEN schrijven naar het bestand.

  • whoami
  • Registratie: December 2000
  • Laatst online: 26-05 23:32
En met een StreamReader kan je van het bestand lezen. :z

https://fgheysels.github.io/


Verwijderd

Topicstarter
haha, dat weet ik.

maar ik kan hiermee niet eruit lezen tot ik bij de juiste regel ben, en die regel dan overschijven.
want ik kan streamreader en streamwriter niet samen gebruiken
HOOGSTENS na elkaar
met een .close ertussen

en door die close gaat ie weer beginnen aan het begin van het bestand.
de class FileStream heeft wel een "read" EN een "write", maar hoe kan ik deze per regel laten gaan?

of is het toch mogelijk om ReadLine EN WriteLine tegebruiken zoals ik dat wil in mijn omschrijving

[ Voor 70% gewijzigd door Verwijderd op 06-04-2004 13:54 ]


  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 05-03 19:51
De FileStream class bevat een method genaamt ToString() waarmee je de gehele stream kan benaderen als String.
De System.String class bevat namelijk op zijn beurt de method Split() waarmee je de string kan splitsen op een bepaald karakter. Deze method returnt een array van strings, met in elk element van het array de overblijfselen van de string die je gesplitst heb op dat bepaalde teken.
Als je dus vervolgens als teken het newline karakter neemt ('\n' of Environment.Newline zoals Gorgi_19 al zei) dan heb je precies wat jij wilt hebben!

Wil je dus vervolgens een zin op regel 19 veranderen, dan doe je
C#:
1
2
string[] gesplitst = filestreampje.ToString().Split(Environment.Newline);
gesplitst[18] = "de nieuwe regel!" 


vervolgens schrijf je het gehele array terug naar je stream en Flush() en Close() je de boel.
Het terugschrijven mag je zelf verzinnen ;)
(tip: 'foreach')

[ Voor 4% gewijzigd door BezurK op 06-04-2004 13:52 . Reden: code tags toegevoegd ]

Rookworst zonder R is ook worst.


Verwijderd

Topicstarter
Yo, dis lijkt nou precies wat ik zocht...
Thnx maat.

Er is alleen 1 klein probleempje, de regel:
code:
1
string[] gesplitst = filestreampje.ToString().Split(Environment.Newline);

wordt niet geaccepteerd.

Error CS1502 : The Best overloaded method match for 'String.Split(Params Char[]);' Has some invalid arguments

en

Error CS1503 : Argument '1', cannor convert from 'string' to 'char[]'

  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 05-03 19:51
Verwijderd schreef op 06 april 2004 @ 14:34:
Yo, dis lijkt nou precies wat ik zocht...
Thnx maat.

Er is alleen 1 klein probleempje, de regel:
code:
1
string[] gesplitst = filestreampje.ToString().Split(Environment.Newline);

wordt niet geaccepteerd.

Error CS1502 : The Best overloaded method match for 'String.Split(Params Char[]);' Has some invalid arguments

en

Error CS1503 : Argument '1', cannor convert from 'string' to 'char[]'
Environment.Newline is idd een string, en de Split() functie wil graag een "array of characters" (char[])... Dat lijkt mij niet zo moeilijk te omzeilen ;) (hint: System.String.ToCharArray())

En als je er echt niet uit komt, kan je altijd
C#:
1
Split('\n');

doen... dan is je code alleen niet geheel multiplatform ;) (newlines zijn niet op elk platform gelijk... sommige plaforms gebruiken alleen carriage return, anderen alleen newline, weer anderen gebruiken beide)

[ Voor 7% gewijzigd door BezurK op 06-04-2004 14:42 ]

Rookworst zonder R is ook worst.


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik ben net even door de documentatie van .Net heen gelopen en ik zou opletten met het gebruik van Split met Newline, want volgens mij als het een dubbel teken is, dan splitst hij op beide tekens. Dus:

"blablablabla<newline>albalb"

Zou dan een array worden met worden:
"blablablabla"
<lege string>
"albalb"

  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 05-03 19:51
bigbeng schreef op 06 april 2004 @ 14:52:
Ik ben net even door de documentatie van .Net heen gelopen en ik zou opletten met het gebruik van Split met Newline, want volgens mij als het een dubbel teken is, dan splitst hij op beide tekens. Dus:

"blablablabla<newline>albalb"

Zou dan een array worden met worden:
"blablablabla"
<lege string>
"albalb"
Dat heb je goed ;)
maar ik vond het nou juist zo leuk om de TS daar zelf achter te laten komen :)

Rookworst zonder R is ook worst.


Verwijderd

Topicstarter
dat had ik ook al gevonden, maar waar ik nou mee aan het kloten ben is om die string array te gebruiken.

Als het goed is wordt ie wel gevuld, ik krijg tenminste geen errors...
maar ik kan un niet uitlezen.
code als:


code:
1
2
int i = 1
textBox1.Text = Regel[i]


krijg ik out of bound, net of dat de array geen grote heeft :S

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Verwijderd schreef op 06 april 2004 @ 15:23:
dat had ik ook al gevonden, maar waar ik nou mee aan het kloten ben is om die string array te gebruiken.

Als het goed is wordt ie wel gevuld, ik krijg tenminste geen errors...
maar ik kan un niet uitlezen.
code als:


code:
1
2
int i = 1
textBox1.Text = Regel[i]


krijg ik out of bound, net of dat de array geen grote heeft :S
C# heeft toch 0-based arrays? Net als Java en C/C++?

Vraag de grootte van je array eens op.

[ Voor 5% gewijzigd door bigbeng op 06-04-2004 15:50 ]


Verwijderd

Topicstarter
Hij heeft een lengte van 1 en de inhoud daarvan is "System.IO.FileStream"

  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 05-03 19:51
Verwijderd schreef op 06 april 2004 @ 15:57:
Hij heeft een lengte van 1 en de inhoud daarvan is "System.IO.FileStream"
Oeps... my bad :o

De ToString() method geeft de naam van de class |:(

Wat je dus zult moeten doen is een string vullen met de inhoud van je FileStream. Dat kan je doen door bijv. je FileStream object mee te geven in de constructor van een StreamReader en dan vervolgens met de ReadToEnd() method alles in een string te plaatsen...

dit soort dingen hoor je zelf toch te kunnen vinden hoor. Als je dat niet kan zie ik het somber voor je in als programmeur ;)

Rookworst zonder R is ook worst.


Verwijderd

Topicstarter
Bedankt, ik zal vandaag eens gaan proberen...

Ik ben pas sinds een maand bezig met C++, en pas 1,5 week met C#, dus ik vind eigenlijk dat het me best goed lukt tot nu toe :D

Als ik verder ben met deze taal en het zou me nog niet lukken, dan gaf ik je wel gelijk :D


Ik heb het nu met de volgende code gedaan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
StreamReader fs = new StreamReader(@"C:\test.txt");
string file = fs.ReadToEnd();
string[] regels = file.Split('\n'); 
textBox1.Text = System.Convert.ToString(regels.Length);
textBox2.Text = regels[0];
textBox3.Text = regels[1];
fs.Close();
StreamWriter sw = new StreamWriter(@"C:\test1.txt");
for (int i=0; i<regels.Length; i++)
{
  sw.WriteLine(regels[i]);
}
sw.Close();


Er moet alleen 1 kleine aanpassing worden gedaan en dat ik dat het laatste karakter van elke string niet moet worden opgeslagen, maar dat lukt wel daar heb ikke geen hulp bij nodig.

Thnx iedereen

[ Voor 55% gewijzigd door Verwijderd op 07-04-2004 09:10 ]


  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 05-03 19:51
Verwijderd schreef op 07 april 2004 @ 08:28:
Bedankt, ik zal vandaag eens gaan proberen...

Ik ben pas sinds een maand bezig met C++, en pas 1,5 week met C#, dus ik vind eigenlijk dat het me best goed lukt tot nu toe :D

Als ik verder ben met deze taal en het zou me nog niet lukken, dan gaf ik je wel gelijk :D


Ik heb het nu met de volgende code gedaan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
StreamReader fs = new StreamReader(@"C:\test.txt");
string file = fs.ReadToEnd();
string[] regels = file.Split('\n'); 
textBox1.Text = System.Convert.ToString(regels.Length);
textBox2.Text = regels[0];
textBox3.Text = regels[1];
fs.Close();
StreamWriter sw = new StreamWriter(@"C:\test1.txt");
for (int i=0; i<regels.Length; i++)
{
  sw.WriteLine(regels[i]);
}
sw.Close();


Er moet alleen 1 kleine aanpassing worden gedaan en dat ik dat het laatste karakter van elke string niet moet worden opgeslagen, maar dat lukt wel daar heb ikke geen hulp bij nodig.

Thnx iedereen
Ik ben het met je eens dat je heus niet zomaar alles hoef te weten, en zéker niet na een maandje programmeren. Het is alleen wel zo dat programmeren voor ruim de helft bestaat uit documentatie lezen en dingen opzoeken. Geen enkele programmeur kent bijvoorbeeld de hele .net class library uit z'n kop. Daar hebben alle programmeurs MSDN voor om dingen in op te zoeken.
Ik bedoelde dus dat het erg belangrijk is dat je daar handig in wordt. Als het je niet lukt dingen te lezen of op te zoeken, dan heeft programmeren geen zin. Niet dat ik twijfel aan je, want ik geloof best dat je het kan, maar ik wilde het toch even duidelijk maken ;)

Rookworst zonder R is ook worst.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Waarom gebruik je geen StringReader? Die heeft een mooie ReadLine Method.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Ik heb in mijn programma een aantal keer het bestand geopend en weer gegevens eruit gehaald, maar dat is eigenlijk niet de bedoeling.

door bovengeschreven manier (en het programma flink te veranderen) lees ik er eenmalig uit, en schrijf er eenmalig in.
Verder is het programma ook overzichtelijker en korten geworden :D

en verder:
StringReader bevat niet BEIDE : ReadLine EN Writeline...

edit:

aangepast omdat niet iedereen lijkt te snappen wat ik bedoel

[ Voor 15% gewijzigd door Verwijderd op 07-04-2004 15:34 ]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Verwijderd schreef op 07 april 2004 @ 14:25:
en verder:
StringReader bevat geen ReadLine EN Writeline...
StringReader bevat wel een Method ReadLine, maar geen WriteLine.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op 07 april 2004 @ 14:25:
Ik heb in mijn programma een aantal keer het bestand geopend en weer gegevens eruit gehaald, maar dat is eigenlijk niet de bedoeling.

door bovengeschreven manier (en het programma flink te veranderen) lees ik er eenmalig uit, en schrijf er eenmalig in.
Verder is het programma ook overzichtelijker en korten geworden :D

en verder:
StringReader bevat niet BEIDE : ReadLine EN Writeline...
Het bevat WEL een ReadLine. Maar ik had niet goed gekeken, je moet streamreader hebben, Stringreader leest van een betreffende string.

(niet getest) ->
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
StreamReader reader = new StreamReader("Foo.txt");
// lines start at 1, so line 1 is the first line. 
// Add 1 for the rest of the file.
string[] lines = new string[lineNumberToChange+1];

for(int i=1;i<lineNumberToChange;i++)
{
    lines[i-1]=reader.ReadLine();
}
lines[lineNumberToChange-1]=newLine;

// read line to be replaced
reader.ReadLine();
lines[lineNumberToChange] = reader.ReadToEnd();
reader.Close();

// write file

StreamWriter writer = new StreamWriter("Foo.txt");
for(int i=0;i<lines.Length;i++)
{
    writer.WriteLine(lines[i]);
}

writer.Close();

[ Voor 8% gewijzigd door EfBe op 07-04-2004 15:48 . Reden: Laatste regel vergeten te copyen ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Damn, lezen is wel erg moeilijk.

Wat ik zeg is dat StringReader (en ook StreamReader) beide LEES classes zijn, deze kunnen heel mooi lezen met behulp van ReadLine, maar ze kunnen niet SCHRIJVEN met WriteLine.

Maar door de manier van een String-Array lees ik nou het volle bestand in een keer in, en schijf ik het als het nodig is. Het lezen en schrijven doe ik doormiddel van
- StreamReader en zijn ReadToEnd
- StreamWriter en zijn WriteLine (in een for loop)

  • whoami
  • Registratie: December 2000
  • Laatst online: 26-05 23:32
Verwijderd schreef op 07 april 2004 @ 16:35:
Damn, lezen is wel erg moeilijk.

Wat ik zeg is dat StringReader (en ook StreamReader) beide LEES classes zijn, deze kunnen heel mooi lezen met behulp van ReadLine, maar ze kunnen niet SCHRIJVEN met WriteLine.
Nee, maar je kan wel een rewrite doen van je file met een stringwriter (zoals EfBe al aantoont, en ik in het begin van dit topic ook gezegd heb).
Je leest je volledige file in, wijzigt waar nodig, en overschrijft 'm.

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op 07 april 2004 @ 16:35:
Damn, lezen is wel erg moeilijk.

Wat ik zeg is dat StringReader (en ook StreamReader) beide LEES classes zijn, deze kunnen heel mooi lezen met behulp van ReadLine, maar ze kunnen niet SCHRIJVEN met WriteLine.
Zeg ventje, als je het beter weet, zeg dat dan voortaan, dan spendeer ik mn tijd aan het helpen van mensen die wel geholpen willen worden. StreamReader lijkt me een leesclass. So? Lezen -> veranderen -> schrijven.
Maar door de manier van een String-Array lees ik nou het volle bestand in een keer in, en schijf ik het als het nodig is. Het lezen en schrijven doe ik doormiddel van
- StreamReader en zijn ReadToEnd
- StreamWriter en zijn WriteLine (in een for loop)
De StreamReader's ReadLine kun je gebruiken voor het lezen van de regels, zodat je geen splits e.d. nodig hebt, zoals ik in het korte stukje code aangaf.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Mijn excuse voor m'n uitbrander...

maar lezen -> aanpassen -> schijven gaat niet want dan kan ik de regel niet meer terug vinden.


en dat StreamReader en StreamWriter ReadLine en Writeline bevatten had ik al in de begin post gezegt...

het ging om een class die BEIDE ondersteunde.

en door het gehele bestand in te lezen, aan te passen en te schijven hoev ik niet de specifieke regel in het bestand te vinden en nou nou lukt het wel.
als het nou toch lukt is het toch mooi??
d'r zijn meerdere wegen die na rome leiden...

en als laatste heb ik mijn oplossing hierboven al gepost, en daarmee had ik graag het topic willen sluiten.
dus dan zou ik dat graag met dit topic willen doen.

[ Voor 50% gewijzigd door Verwijderd op 07-04-2004 17:18 ]


  • d00d
  • Registratie: September 2003
  • Laatst online: 16-09-2025

d00d

geen matches

Verwijderd schreef op 07 april 2004 @ 08:28:
Er moet alleen 1 kleine aanpassing worden gedaan en dat ik dat het laatste karakter van elke string niet moet worden opgeslagen, maar dat lukt wel daar heb ikke geen hulp bij nodig.
Hoi Quantum,

Ik heb nog een tip voor je, uit de laatste opmerking lees ik dat je gewoon de laatste tekens van iedere regel wilt verwijderen uit een file. Verder zul je waarschijnlijk gebruik maken van Visual Studio om het C# progje te maken. Wat je nu ook kunt doen is het volgende.

- open de te wijzigen file in VS
- CRTL + H (replace)
- Find what = "{.*}.#$" (zonder de quotes)
- Replace with = "\1" (zonder de quotes)
- check checkbox "Use:" en selecteer "Regular expressions"
- klik op Replace All

et voila

Daniel

42.7 percent of all statistics are made up on the spot.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op 07 april 2004 @ 17:06:
Mijn excuse voor m'n uitbrander...
Ok.
maar lezen -> aanpassen -> schijven gaat niet want dan kan ik de regel niet meer terug vinden.
Je zult wel moeten. Het punt is dat de file wellicht in regels lijkt te zijn opgedeeld maar in wezen is het een ononderbroken stream bytes. Ga jij ergens op positie 200 een stukje van 25 chars (die eerst een regel vormde) vervangen door 10 chars (die de nieuwe regel vormen) dan heb je een gat van 15 chars.

M.a.w.: je zult de file in moeten lezen, wijzigen en wegschrijven.
het ging om een class die BEIDE ondersteunde.
Dat kan dus niet, zie boven.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1