• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapisywanie do pliku liter za pomocą wartości ASCII - różne wyniki przy niewielkiej zmianie

Object Storage Arubacloud
0 głosów
501 wizyt
pytanie zadane 23 kwietnia 2016 w C i C++ przez RycerzAndromedy Użytkownik (670 p.)
otagowane ponownie 23 kwietnia 2016 przez RycerzAndromedy

Cześć,

Dlaczego przy zapisie do pliku (ostatni warunek), taka forma daje oczekiwany wynik (same duże litery łacińskiego alfabetu), a ...

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
string napis1, napis2;
int i, j;
int main()
{
ifstream slowa;
slowa.open("tj.txt");
ifstream klucze;
klucze.open("klucze1.txt");
ofstream output;
output.open("wynik4a.txt");
 
while (slowa >> napis1 && klucze >> napis2)
{
   for (i=0, j=0; i<napis1.size(); i++, j++)
    {
         if (j==napis2.size())
        j=0;
    char pomoc = napis1[i]+napis2[j]-64;
    if (pomoc>90)
       pomoc=pomoc-26;
     output << pomoc;
    }
   output << endl;
}
 
slowa.close();
klucze.close();
output.close();
 
    return 0;

... a z lekko zmienionym ostatnim warunkiem:

 if (pomoc>90)
        output <<pomoc-26;
    else output << pomoc;


daje w wyniku oprócz liter też cyfry? Czy ma to związek z tym, że output < pomoc-26 zapisuje i wartość ASCII char pomoc i wartość int 26?

1 odpowiedź

+1 głos
odpowiedź 23 kwietnia 2016 przez Sebastian Fojcik Nałogowiec (43,020 p.)
wybrane 24 kwietnia 2016 przez RycerzAndromedy
 
Najlepsza

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;
}

 

Podobne pytania

+2 głosów
0 odpowiedzi 1,192 wizyt
–1 głos
1 odpowiedź 1,756 wizyt
pytanie zadane 28 maja 2017 w C i C++ przez Norbert123 Początkujący (290 p.)
0 głosów
1 odpowiedź 291 wizyt

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...