Diskuze: Zapsání do souboru v C#
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 50 zpráv z 54.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Co to je? Proboha!
using (StreamDdd sr/sw = new StreamDdd(new FileStream("path", parameters)))
StreamDdd dej buď "StreamReader", nebo "StreamWriter" podle toho ten název proměnné... Path == cesta k souboru - nejlépe v ApplicationData:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\Složka\nazev.pripona"
No a dovnitř usingu dáš buď
sr.Read(Line/ToEnd)();
nebo
sw.Write(Line)("ddd");
Co znamená ta zkratka ddd, kterou tak často používáš?
Doporučená denní dávka to asi nebude, že?
Protože na to jdeš kdo ví jak - čtení:
string text = "";
using (StreamReader sr = new StreamReader("ceta"))
text = sr.ReadToEnd();
nebo:
using (StreamReader sr = new StreamReader(new FileStream("ceta", parametry)))
text = sr.ReadToEnd();
nebo:
string line = "";
using (StreamReader sr = new StreamReader(new FileStream("ceta", parametry)))
while ((line = sr.ReadToEnd()) != null)
text += Enfironment.NewLine + line;
nebo:
using (StreamReader sr = new StreamReader(new FileStream("ceta", parametry)))
{
ddd
}
Zápis:
using (StreamWriter sw = new StreamWriter("ceta"))
sw.Write(ddd);
nebo:
using (StreamWriter sw = new StreamWriter(new FileStream("ceta", parametry)))
sw.WriteLine(ddd);
A kvlůli těm 6000000 možnostem se mi to nechtělo vypisovat... Je to tu, i
v manuálu - tak proč si to neprojdeš?
Furt to nejde.... :/ Zkousel jsem par kodu od tud
http://www.itnetwork.cz/…-soubory-txt
ALE VUBEC NEJDE ://
Nepoužívej při popisování problémů slovo nejde, tím ostatním neřekneš vůbec nic - jestli to nejde zkompilovat, hází to chybu nebo to nefunguje tak, jak by mělo...
Nejde mi vubec nic zkousel jsem toto z knizky
StreamReader sr=new StreamReader(fn);//Cestna souboru je v promene fn
string s=sr.ReadToEnd();
sr.Close();
return s;
Nic se nestane. Po zmacknuti se nic nestane a hodi to chybovou hlasku ve VISUAL .
Máš tam
using System.IO;
?
Proč nepoužíváš using? (Pro StreamDdd.)
using System.IO;
...
using (StreamReader sr = new StreamReader("ceta"));
Jít musí.
Pokud sem nenapíšeš tu chybovou hlášku tak s tím asi nic neuděláme, protože křišťálová koule je zase v čistírně. Jak je to v tutoriálu, tak to funguje. Ještě mě napadá jestli jsi četl tohle: http://www.itnetwork.cz/…e-se-soubory
zkus něco takového na uložení ...
using (StreamWriter sw = new StreamWriter(@"data/save.txt"))
{
sw.WriteLine(a);
sw.WriteLine(b);
sw.WriteLine(c);
sw.WriteLine(d);
sw.WriteLine(e);
sw.WriteLine(f);
sw.Flush();
sw.Close();
}
Kod mám vloženy takto : NEVIM CO DAT DO PARAMETRU
private void button3_Click(object sender, EventArgs e)
{ string s = "";
string fn = slozka + "\\DATABAZE.txt";
using (StreamReader sr = new StreamReader(new FileStream(fn,JSEM NEVIM CO MÁM NAPSAT)))
text = sr.ReadToEnd();
Píše mi to tuto chybu :
Chyba 2 'System.IO.FileStream' neobsahuje konstruktor, který přijímá 1 argumentů c:\users\tsuna\documents\visual studio 2012\Projects\ZAPISDOSOUBORUACETNI(sam,slovpocet,...)\ZAPISDOSOUBORUACETNI(sam,slovpocet,...)\Form1.cs 103 55 ZAPISDOSOUBORUACETNI(sam,slovpocet,...)
Visual studio je dost dobrý pomocník a napovídá ti . Každopádně musíš minimálně
připsat FileMode. V tvém případě Open.
StreamReader sr = new StreamReader(new FileStream(fn,FileMode.Open)))
Chceš tím naznačit, že ten buffer nemusí čistit a že nemusí ten soubor zavírat? Jak ho pak zavřeš?
Já jenom že v C# nefungují destruktory jak by měly a pokud by se soubor zavíral až destruktorem, bylo by to špatně.
Pokud to using provádí jinak, tak je to OK.
Nevím nic o tom že by using vyvolal Flush(), zavolá jen Close(), s tím máš pravda, že tam být nemá.
To jsi se do toho tutoriálu asi moc nedíval chlape...
Nač čistit buffer před zavřením? Ano - using to zavře. Není tam další zápis - nač tedy čistit?
Flush() nejen ten buffer vyčistí, ale taky zapíše ty data, samotné WriteLine () je do toho souboru ještě neuloží hned.
Naštěstí Close() interně Flush() volá.
string fn = slozka + "\\DATABAZE.txt";
hele ... kde máš definovanou cestu k SLOZKA ... ?
Ano - nevyjádřil jsem se správně - jelikož spěchám - ve škole nesmíme být na PC... Prostě stačí jen using - je od toho, že se o tyto věci postará...
Trošku jsem se zamotal v tom kdo má pravdu... Ale když jsme u toho jak mohu z txt dat precist data a vlozit do LISTU STRINGU ? NEJDE MI TO A PISE TO CHYBU...
public string slozka
{
get
{
//application.... - vraci nazev souboru ktery je spusten!
FileInfo fi = new FileInfo(Application.ExecutablePath);
return fi.DirectoryName;
}
}
List<string> textak = new List<string>();
StreamReader sr = new StreamReader(new FileStream(fn, FileMode.Open));
textak = sr.ReadToEnd();
Chyba piše tuto chybu.
Chyba 2 Typ 'string' nelze implicitně převést na typ 'System.Collections.Generic.List<string>' c:\users\tsuna\documents\visual studio 2012\Projects\ZAPISDOSOUBORUACETNI(sam,slovpocet,...)\ZAPISDOSOUBORUACETNI(sam,slovpocet,...)\Form1.cs 115 20 ZAPISDOSOUBORUACETNI(sam,slovpocet,...)
Děkuju za každou radu.
Jednodušší bys měl použít třídu File:
String soubor = "C:\Složka\soubor.txt";
String[] radkySouboru = File.ReadAllLines(soubor);
Console.WriteLine("Pocet radku: " + radkySouboru.Length);
V poli radkySouboru máš pak načtený celý soubor, co jeden řádek, to jeden String v poli.
Podobně pak můžeš zapisovat, třeba:
String soubor = "C:\Složka\soubor.txt";
String[] radkyKZapsani = new String[3] {"Řádek 1", "Řádek 2", "Řádek 3"};
File.WriteAllLines(soubor, radkyKZapsani);
Blbost - using je lepší - nejen, že vyřeší správné uzavření souboru atd., ale i celkově jeho použití je jednodušší, praktičtější,... A zapsat pole stringu v něm můžeš také - jenže proč?
Třída File všechno řeší za tebe, jedním řádkem kódu zapíšeš/načteš soubor do stringu nebo řádky souboru do pole stringů, pokud nepotřebuješ v tu chvíli řešit něco pokročilejšího (třeba načítat jen něco, používat kompresi apod.), tak je to nejjednodušší postup, všechno včetně otevření a zavření souboru a uvolnění prostředků dělá za tebe...
I v PHP je lepší používat tyto specializované třídy a metody, protože řeší kolizi více procesů pracujících s jedním souborem. Je to použitelné vždy, kdy potřebuji číst nebo zapisovat celý soubor naráz, případně appendovat jeden blok textu. Zpravidla je to i rychlejší.
Je to vynikající například při logování chyb.
Pro srovnání tvoje verze, která načte obsah souboru do stringu:
string line = "";
using (StreamReader sr = new StreamReader(new FileStream("cesta", parametry)))
while ((line = sr.ReadToEnd()) != null)
text += Enfironment.NewLine + line;
a verze přes File :
String line = File.ReadAllText("cesta");
Asi jsi měl na mysli
String text = File.ReadAllText("cesta");
Co asi řeší navíc, když je to FileStream? Musíš to ručně uzavřít...
Pri vlozeni toho kodu co napsal satik to pise toto
Chyba 3 Název 'Enfironment' v aktuálním kontextu neexistuje c:\users\tsuna\documents\visual studio 2012\Projects\ZAPISDOSOUBORUACETNI(sam,slovpocet,...)\ZAPISDOSOUBORUACETNI(sam,slovpocet,...)\Form1.cs 118 22 ZAPISDOSOUBORUACETNI(sam,slovpocet,...)
[\code]
Mám dalsi problem. Pri zmacknuti buttonu tak kdyz zjistuji samohlasky pres forech tak se mi to furt zvysuje o ten pocet co to spocitalo poprve( Takze z 11 je treba 22 a pak 33 a tak se to zvysuje furt o +11). Takže pri vypisu do TEXTBOXU se mi to?
[\code]
foreach (char znak in s)
{
if (samohlasky.Contains(znak))
{
pocetsamohlasek++;
}
}
Proč by to měl ručně zavírat? File.ReadAllText() soubor otevře, přečte a zavře.
Máš tam chybku, má být Environment.
Jestli to dobře chápu, tak nenuluješ tu proměnnou pocetsamohlasek před tím počítáním, takže ti tam zůstává hodnota od minulého počítání.
File není instance třídy FileStream, ale statická
třída .NETu, která poskytuje pár funkcí se soubory.
K načtení obsahu souboru pak opravdu nepotřebuješ nic víc, než ten jeden
příkaz, který za tebe ten soubor otevře, načte data a zase ho zavře a
uvolní, tam už není žádný kód okolo, který bys musel volat.
Myslis tento kod
Jen co je ten Enfironment ?? Jak jsem psal vyse pise mi to chybovoou hlasku ...
. Je Enfironment promena nebo tak ??
string line = "";
using (StreamReader sr = new StreamReader(new FileStream("cesta", parametry)))
while ((line = sr.ReadToEnd()) != null)
text += Enfironment.NewLine + line;
ci tento
String line = File.ReadAllText("cesta");
Jinak dekuju za pomoc...
Dekuju za vysvetleni.
Jeste kdybych se mohl zeptat jak zjistim pocet pismen v txt souboru? Snazim se
to zjitit pres forech jako souhlasky a samohlasky ale nejak to nejde ... Tak
jestli bych mohl pozadat jeste o radu... Dekuju predem
Zobrazeno 50 zpráv z 54.