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

question-closed "Odwracanie binarne" pliku txt

Object Storage Arubacloud
0 głosów
666 wizyt
pytanie zadane 15 kwietnia 2015 w C i C++ przez criss Mędrzec (172,590 p.)
zamknięte 17 listopada 2016 przez criss

Napisałem program mający "odwracać" zawartość pliku txt. Tzn.: znak o kodzie ASCII 255, zamieni na znak o kodzie 0. I to działa jak trzeba (no, o ile w linii nie jest za dużo znaków, ale to pewnie problem z pojemnością stringa). Problem zaczyna się gdy chcę zdekodować plik (czyli odpalić ten sam program na zakodowanym pliku). Program nie tyle robi to źle, co po prostu się crashuje. Poniżej kod:

#include <cstdlib>
#include <iostream>
#include <math.h>
#include <ctype.h>
#include <fstream>

using namespace std;
  
int main()
{
    fstream plikin,plikout;
    string infile,outfile;
    
    cout<<"Podaj nazwe pliku do odczytu (bez rozszerzenia): ";
    cin>>infile;
    infile+=".txt";
    cout<<"Podaj nazwe pliku do zapisu (bez rozszerzenia): ";
    cin>>outfile;
    outfile+=".txt";
    plikin.open(infile.c_str(),ios::in);
    plikout.open(outfile.c_str(),ios::out);
    while(!plikin.eof())
    {
        string linia="";
        char bin[8];
        
        getline(plikin,linia);
        for(short j=0;j<linia.length();j++)
        {
             for(short i=0;i<=7;i++) bin[i]='0'; //koniec petli i
             
             int liczba=0;
             if(isdigit(linia[j]))liczba=(int)linia[j]-'0';
             liczba=(int)linia[j];
             
             itoa(liczba,bin,2);
             int dec=0;
             
             for(short k=0;k<=7;k++)
             {
                       if(bin[k]=='0'){ bin[k]='1'; dec+=pow(2,k); }
                       else if(bin[k]=='1') bin[k]='0';
                       }//koniec petli k
             plikout<<(char)dec;
             }//koniec petli j
             plikout<<endl;
        }   //koniec while
                  
    system("PAUSE");
    return EXIT_SUCCESS;
}

 

komentarz zamknięcia: hejka hejka

2 odpowiedzi

+2 głosów
odpowiedź 15 kwietnia 2015 przez jeremus Maniak (59,720 p.)
wybrane 15 kwietnia 2015 przez criss
 
Najlepsza

chyba problem jest w tym skomplikowanym kodzie .bardzo sobie utrudniłes wchodząc w operacje bitowe.

zobacz że to samo można uzyskac tak prosto : 

kod ten zarówno u Ciebie jak i umnie nie skonwetuje znaków końca linii - bo używasz getline. czytając po znaku skonwertuje wszystko

    while(!plikin.eof())
    {

        getline(plikin,linia);
        for(int j=0;j<linia.length();j++)
        {
          c=linia[j];
          plikout<<(char)(255-(short)c);
        }//koniec petli j

   }   //koniec while

 

komentarz 15 kwietnia 2015 przez criss Mędrzec (172,590 p.)
Faktycznie, dzięki za uwage : D

Faktycznie twoja propozycja jest zdecydowanie prostsza i powinna działać. Ale z niewiadomego powodu nie działa. W ciągu kilku sekund plik wyjściowy zapełnił się 27MB czegoś, ale nie moge go otworzyć (pewnie notatnik sobie nie radzi z taką ilością tekstu). Nie wiem z czego to wynika.

edit: w końcu odczytał go i były to same endl, chyba źle wpisałem nazwe pliku wejściowego, sorry : D
komentarz 15 kwietnia 2015 przez criss Mędrzec (172,590 p.)
Ok, Twoje rozwiązanie działa w 100% dobrze. Dzięki za pomoc (: temat do zamknięcia
0 głosów
odpowiedź 15 kwietnia 2015 przez Eerie Mądrala (7,130 p.)
Znaki które normalnie widzisz, w tabeli ASCII zaczynają się od 32 (32 oznacza spację). Wcześniej masz różne pierdoły służące do sterowania drukarkami, wysyłania przeróżnych komunikatów itp. Zobacz sobie to: http://pl.wikipedia.org/wiki/ASCII

Start of text, end of text, backspace, null, entery i inne takie pierdoły. Obstawiam, że któryś z tych znaków sterujących o kodzie ASCII poniżej 32 powoduje crasha. Zrób tak, żeby twój program nie używał znaków o kodzie mniejszym niż 32. Niech 255 zmienia na 32, 254 na 33, 32 niech zmienia na 255 a 33 niech zmienia na 254.

No i jest tam jeszcze jeden znak sterujący o kodzie 127. Btw, ma ktoś pełną tabelę ze wszystkimi znakami do 255?
komentarz 15 kwietnia 2015 przez Harsay Pasjonat (23,640 p.)
komentarz 15 kwietnia 2015 przez criss Mędrzec (172,590 p.)

Po dodaniu ifów (oczywiście w odpowiednich miejscach):

if(liczba<=32) liczba+=32;
if(dec<=32) dec+=32;

Co prawda nie crashuje się, ale nie dekoduje tak jak trzeba.

Podobne pytania

0 głosów
2 odpowiedzi 7,187 wizyt
0 głosów
1 odpowiedź 1,463 wizyt
pytanie zadane 19 lutego 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
–1 głos
3 odpowiedzi 518 wizyt
pytanie zadane 20 sierpnia 2020 w C i C++ przez Drożdżówka Obywatel (1,870 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...