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

Przesunięcie kodu ASCII w pliku tekstowym

Object Storage Arubacloud
0 głosów
319 wizyt
pytanie zadane 11 listopada 2020 w C i C++ przez Gohard Nowicjusz (150 p.)

Witam, ostatnio rozpocząłem jeden ze swoich pierwszych projektów. Napisałem program który miał za zadanie przesunąć kod ASCII w pliku tekstowym o 1 tak aby np. napis "ALA" zamienił się w "BMB" (Czyli char'y z wartością ASCII +1).

Problem pojawił się w pętli która ma za zadanie zmienić wartość liter w stringu. Kiedy odpalam program wartość temp (czyli ilość znaków w linijce pliku .txt) daje złe wartości a zawartość zmienionego stringa w tablicy to losowe znaki. Plik tekstowy nie zmienia się tak jak powinien. 

Byłbym wdzięczny gdyby ktoś wiedział gdzie zrobiłem błąd w pętli, nasiedziałem się nad tym dobre parę godzin. Z góry przepraszam jeżeli kod jest nieczytelny albo źle sformatowany, dopiero zaczynam wink

 

Pętla z błędem pojawia się po alokowaniu tablicy char l, wszystko przed tym działa tak jak powinno.

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <cstdlib>
#include <string>
#include <time.h>

using namespace std;

void optionC()
{
    //Getting txt file
    string name;
    cout<<"Type name of the txt file: "<<name;
    cin>>name;
    name+=".txt";
    fstream plik;
    plik.open(name,ios::in);
    if (!plik)
    {
        cerr << "Unable to open file datafile.txt";
        exit(1);
    }

    //Counting file lines
    string line;
    int line_num=1;
    while(getline(plik, line))
    {
        line_num++;
    }
    plik.close();

    //Alocating string
    string *lines;
    lines = new string [line_num];
    plik.open(name,ios::in);
    int i=0;
    while(getline(plik, line))
    {
        lines[i]=line;
        i++;
    }
    plik.close();

    //ascii
    string bufor;
    char *l;
    l = new char [1000];

    //BŁĄD 
    for(int a=1;a<line_num;a++)
    {
        int temp = lines[a-1].length();
        cout<<"[TEMP: "<<temp<<"] ";
        for(int b=0;b<=temp;b++)
        {
            bufor = lines[a-1];
            l[b] = bufor[b];
            //Changing ascii position
            if (l[b]>125)
            {
                l[b]=l[b]-1;
            }
            else
            {
                l[b]=l[b]+1;
            }
            bufor[b]=l[b];
        }
        lines[a-1]=bufor;
        cout<<lines[a-1]<<endl;
    }
    cout<<"works";
    

    //saving
    plik.open(name,ios::out);
    int h=0;
    while(i<line_num)
    {
    plik<<lines[h]<<endl;
    h++;
    }
    plik.close();

    delete [] l;
    delete [] lines;
}

int main()
{
    optionC();
    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 12 listopada 2020 przez j23 Mędrzec (194,920 p.)
edycja 12 listopada 2020 przez j23
  • Linia 49: nie wiem, po co Ci ta alokacja, spokojnie możesz to zrobić in-place, w stringu, w tablicy lines.
  • Linia 52: dlaczego zaczynasz liczenie od 1, skoro później indeksujesz tak: [a-1]? Gdzie tu logika?
  • Linia 56: zły warunek - powinno być b < temp
  • Linia 58: powinna znaleźć się przed pętlą for.
  • Linia 80: pewny jesteś tego i w warunku?

Zamiast new i delete użyj kontenera std::vector. Dziś tak się nie pisze w C++...

Podobne pytania

0 głosów
1 odpowiedź 549 wizyt
pytanie zadane 26 listopada 2019 w C i C++ przez Hardwell Dyskutant (8,980 p.)
0 głosów
7 odpowiedzi 478 wizyt
pytanie zadane 7 czerwca 2019 w C i C++ przez Dew Początkujący (290 p.)
0 głosów
1 odpowiedź 947 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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!

...