Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ääkköset

Janne Kätevä [30.01.2005 14:54:38]

#

Ongelma on, etten saa luettua Windows-Dos-ympäristössä tekstitiedostosta Ä, Ö, Å-merkkejä oikein... Ne tulostuu ruudulle ihme merkkeinä ja niiden char arvot n negatiivisia (-60=Ä -59=Å -42=Ö)...
Mikähän tähän ongelmaan auttais... Kun merkit on luettu tiedostosta, ne pitäis sijoittaa string muuttujaan (toimivaksi)merkkijonoksi. Tälläistä oon yrittäny:

int Reader::read(string& buffer, string& tiedosto) {
	int i = 0;
	char merkki;

	ifstream avaa(tiedosto.c_str());

	while(avaa.get(merkki)) {
		buffer += toupper(merkki);
		if (buffer[i] == -60 || buffer[i] == -28)
			buffer[i] = 142;
			cout << "Merkki: " << (int)merkki << endl;
		if (buffer[i] == -42 || buffer[i] == -10)
			buffer[i] = char(143);
		if (buffer[i] == -59 || buffer[i] == -27)
			buffer[i] = char(153);
		i++;
	}
	avaa.close();
	return i;
}

Kun esim. Ä on luettu tiedostosta muuttujaan merkki, sen arvo on muka -60. Sitten kun sen muuttaa itse 142, se on sen jälkeen muka -114...

Antti Laaksonen [30.01.2005 15:18:49]

#

Jos muuttujan tyyppi on pelkkä char, arvoalue on -128...127. Sen takia esim. luku 196 pyörähtää ympäri ja sen arvoksi tulee 196 - 256 = -60. Kun muutat tyypiksi unsigned char, arvoalue on 0...255, jolloin minkään merkin koodi ei muutu negatiiviseksi.

Ääkkösten näkyminen väärin johtuu kuitenkin varmaan siitä, että tiedostossa ja näytöllä oleva merkistö on eri. Jos vain ääkkösten suhteen on ongelmia, voit tehdä vaikka itse funktion, joka muuttaa luetut ääkköset oikeaan muotoon. Konsoliohjelmassa WinAPIn funktio CharToOem taitaa tehdä vastaavan tempun.

#include <stdio.h>
#include <windows.h>

int main (void) {
    char vanha[10] = "Ääkköset", uusi[10];
    CharToOem(vanha, uusi);
    printf(uusi);
    return 0;
}

Janne Kätevä [30.01.2005 18:43:58]

#

Millä tavalla tiedostosta sais luettua unsigned char muuttujaan suoraan, get() ei vissiin pysty. Muuttuuko kaikki taas perseelleen kun unsigned char muuttujia sijoitetaan string muuttujaan peräkkäin?

Antti Laaksonen [30.01.2005 19:54:01]

#

Muistin sisältö pysyy samana määrittelytavasta riippumatta. Yksi merkki vie joka tapauksessa yhden tavun tilaa. Jos muuttuja on etumerkillinen (signed, oletus), niin tavun ensimmäinen bitti ilmoittaa muuttujan merkin. Jos taas muuttuja on etumerkitön (unsigned), ensimmäinen bitti on osa lukua. Siis bitit 11000100 voivat tarkoittaa lukua -60 (char) tai 196 (unsigned char).

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta