Jak masz zmienną typu char, to przekazanie do strumienia tej zmiennej spowoduje zapisanie do pliku litery o danym numerze z tablicy ASCII. Zatem zapisanie litery 'a' odbywa się tak:
char c = 97; // lub char c = 'a';
output << c;
To spowoduje zapisanie 'a'. Natomiast, jeśli zadziałasz na zmiennej char jakimś operatorem arytmetycznym: +, -, *, /, %, to wtedy wartością tego wyrażenia będzie typ int. Przez domniemanie. Zachęcam do przeczytania mojej wypowiedzi, w której wyjaśniam czym są instrukcje, operacje i wyrażenia w C++.
http://forum.pasja-informatyki.pl/49886/wyrazenia-a-instrukcje-petle
Zatem taki zapis:
char c = 'a';
output << c + 1; // int
Zapisze liczbę 98, bo wyrażenie (c + 1) jest intem i ma wartość 98. W takim przypadku musisz oczywiście rzutować wartość tego wyrażenia z powrotem na znak:
SPOSÓB 1 (starszy)
output << (char)(c + 1);
SPOSÓB 2 (nowszy)
output << static_cast< char >( c + 1 );
Ma to znaczenie tylko w przypadku wypisywania wartości wyrażenia. Chodzi o to, ze strumień wyjścia (ofstream i cout) inaczej zachowuje się, gdy przekazujesz mu int, a inaczej gdy char.
Dla wtajemniczonych: operator strumienia << jest przeładowany dla różnych typów.
Dla głębszego zrozumienia stworzyłem 2 funkcje o tej samej nazwie (przeładowane). Jedna zostanie wywołana, gdy przekażesz jej int, a druga gdy char. Przeanalizuj działanie programu i wyciągnij wnioski.
void funkcja( int n )
{
cout << "Wywolano funkcje z liczba" << endl;
}
void funkcja( char c )
{
cout << "Wywolano funkcje ze znakiem" << endl;
}
int main()
{
char c = 'a';
funkcja( c );
c = c + 1;
funkcja( c );
funkcja(c + 1);
funkcja(c = c + 1);
return 0;
}
Jak coś jest niejasne, pytaj :-)
PS. Masz jeszcze taki dydaktyczny programik:
int main()
{
char c = 'a';
cout << c << endl;
c = c + 1;
cout << c << endl;
cout << c + 1 << endl;
cout << c = c + 1 << endl;
return 0;
}