Witam.
Mam pewien problem. Muszę zapisywać znaki - nawet te z przedziału 128-255. Problem jest podobny przy odczytywaniu takich znaków z pliku, ale łatwo go można zniwelować w odróżnieniu do zapisu. Otóż przy odczycie takiego znaku z pliku do, na przykład, zmiennej char to przy sprawdzeniu wartości tego znaku dostaniemy wartość ujemną. Aby dobrze operować na wszystkich znakach wystarczyło zwiększyć wartości ujemne o 256. Problem jest podobny przy zapisie, ale niestety nawet po podaniu prawidłowych wartości znaków rozszerzonego ASCII ten uparcie zapisuje coś innego.
Przykładowy kod w DEVie sprawdzający ten 'bug':
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int a;
char b;
cin >> a;
b=(char)a;
cout << b << ' ' << (int)b << ' ' << (char)a << ' ' << a << endl;
FILE *ww;
ww=fopen("abba.txt","w");
fputc('a',ww);
fputc('\n',ww);
fputc(a,ww);
fputc('\n',ww);
fputc((char)a,ww);
fputc('\n',ww);
fputc('\n',ww);
fputc('b',ww);
fputc('\n',ww);
fputc((int)b,ww);
fputc('\n',ww);
fputc(b,ww);
fputc('\n',ww);
fputc('\n',ww);
if ((int)b<0) fputc(((int)b)+256,ww);
fputc('\n',ww);
fputc('\n',ww);
fputc(161,ww);
fclose(ww);
system("PAUSE");
return EXIT_SUCCESS;
}
Dla liczby 161 na ekran wyrzuci nam:
161
í -95 í 161
Press any key to continue . . .
a w pliku wyląduje:
a
ˇ
ˇ
b
ˇ
ˇ
ˇ
ˇ
Jak widać zamiast í zapisuje ˇ.
Informuję, że też przy zapisie strumieniowym, czy to stringów, czy charów efekt jest ten sam.