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...
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; }
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?
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).
Aihe on jo aika vanha, joten et voi enää vastata siihen.