Miten luen kolme ensimmäistä merkkiä kolmannelta riviltä tiedostosta tiedosto.txt
?
Kieli?
C tai C++ tai Pascal
https://www.ohjelmointiputka.net/oppaat/opas.
http://www.mit.jyu.fi/~vesal/kurssit/winohj/
https://www.ohjelmointiputka.net/oppaat/opas.
Mene lukemaan Pascal-oppaan neljäs osa, Tiedostot. (Edit: Bah, hidas :)
En saanut suoraa vastausta kysymykseeni antamistanne ohjeista. En tahdo lukea koko tiedostoa. Haluan vain lukea tiedostosta tiedosto.txt kolmannen rivin kolme ensimmäistä merkkiä char -tyypiseen taulukkoon. Kieli voisi olla vaikka C tällä kertaa.
Putkan C-oppaasta löytyy gets-funktio jolla voi lukea rivin. Luet kolme kertaa tiedostosta gets funktiolla ja sitten poimit siitä ne kolme ensimmäistä merkkiä. Käytännössä ei ole helpompaa tapaa, jos et tiedä kunkin edeltävän rivin pituutta.
Selvä, tuo auttoikin jo eteenpäin.
Ei-iiih, gets
-funktiota ei saa käyttää yhtään mihinkään! Se on yksi C:n pahimmista puskuriylivuotojen aiheuttajista. Kokeile nyt mieluummin vaikka jotain tällaista:
int c; char s[4]; int i; for (i = 0; i < 2; ++i) { do { c = getchar(); } while (c != EOF && c != '\n'); } for (i = 0; i < 3; ++i) { c = getchar(); s[i] = c == EOF ? '\0' : (char) c; } s[i] = '\0';
Jos luetaan tiedostoa, getchar
ia vastaava funktio on getc
(tai fgetc
). Ja tiedostohan piti avata fopen
illa ja sulkea fclose
lla.
Kiitoksia koo. Tuollaisia virityksiä olinkin jo itse saanut aikaan.
Tiedostonlukuun tarkoitettu fgets ei aiheuta ylivuotoa, koska sille määritellään rivin maksimipituus, mutta sen sijaan sillä voi jäädä rivi lukematta, jos se on maksimia pidempi, jolloin kolme merkkiä eivät tulekaan kolmannelta riviltä.
Pascalilla tämäkin olisi mennyt helpoiten, minun nähdäkseni. Rivin voi skipata Readln:lla, ja kolme merkkiä saa vaikka lukemalla Readln:lla String[3]-tyyppiseen muuttujaan eli kolmen merkin stringiin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.