Olen harjoitellut c++:lla tiedostoon kirjoittamista ja eteen tuli tällainen ongelma, mihin en ole löytänyt vastausta. Yritän selittää...
Ohjelmassa käyttäjä on syöttänyt muuttujaan merkkijonon, jonka pituus saattaa vaihdella. Tiedostoon kirjoitettaessa kuitenkin muuttujasta pitäisi saada 'tyhjät' merkit pois. Siis, jos muuttujalle on määritelty maksimikoko esim. muuttuja[50], mutta käyttäjä syöttääkin merkkijonon joka on pituudeltaan kymmenen merkkiä. Ohjelma tulostaa tiedostoon jäljelle jäävät käyttämättömät merkit tyhjinä välilyönteinä.
Tiedosto näyttää nyt tältä ('_' = tyhjä väli):
Muuttuja1_________________Muuttuja2
Kun sen pitäisi näyttää tältä:
Muuttuja1Muuttuja2
Tällä tapaa pääpirteissään olen tiedostoon kirjoituksen tehnyt:
// Tiedoston avaus ofstream tdsto("tiedosto_nimi"); // Kirjoitetaan muuttujat tiedostoon tdsto.write(muuttuja1, sizeof muuttuja1); tdsto.write(muuttuja2, sizeof muuttuja2); // Tiedoston sulkeminen tdsto.close();
Mikä avuksi? Löytyisikö netistä jotain asiaa sivuavaa ohjetta?
Ei kannata kirjoittaa sizeof muuttuja
n verran, vaan niin monta merkkiä, kuin käyttäjä kirjoitti. Muuten se tosiaan tulostaa nuo "ylimääräiset".
Deewiant kirjoitti:
Ei kannata kirjoittaa
sizeof muuttuja
n verran, vaan niin monta merkkiä, kuin käyttäjä kirjoitti. Muuten se tosiaan tulostaa nuo "ylimääräiset".
Mutta jos ei tiedä etukäteen, kuinka paljon käyttäjä kirjoittaa...
Vai saisiko tuohon jotenkin, että ohjelma laskee muuttujasta merkkien määrän ja kirjoittaa tiedostoon sitten ainoastaan kirjoitetut merkit?
Kannattaa lukea jostakin C(++) oppaasta kohta merkkijonot. Lyhyesti: Merkkijono päättyy nollatavuun. Luettu muuttuja1-merkkijono koostuu esimerkiksi merkeistä 'M','u','u','t','t','u','j','a','1','\0'. Jos kirjotat merkkijonon tiedostoon <<-virtaoperaattorilla (tdsto << muuttuja1;
) kirjoitus lopetetaan kun heti kun nollatavu ilmaantuu.
os kirjoitti:
Jos kirjotat merkkijonon tiedostoon <<-virtaoperaattorilla (
tdsto << muuttuja1;
) kirjoitus lopetetaan kun heti kun nollatavu ilmaantuu.
Jees näinhän se näyttää toimivan. Kiitos! Ajattelin taas kerran asian liian monimutkaisesti...
sizeof() palauttaa varatun char-taulukon koon. strlen() palauttaa taulukkoon kirjoitetun merkkijonon piduuden.
Ja jos kerran C++ on käytössä, niin silloin voi luopua char-taulusta ja ottaa string-luokan käteen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.