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

Dziwny błąd programu do kodowania plików [C++]

Object Storage Arubacloud
+1 głos
299 wizyt
pytanie zadane 22 kwietnia 2015 w C i C++ przez jegor377 Stary wyjadacz (13,230 p.)

właśnie 10 min temu napisałem sobie szybko prosty koder w C++, który miał za zadanie przyjąć od użytkownika klucz i przemienić wszystkie znaki w pliku o ten klucz (generalnie miał wykonać działanie znak+=klucz), no i wszystko pięknie działa, ale na małych i stworzonych przezemnie plikach. Kiedy chciałem tak zakodować większy plik o rozszerzeniu gif lub inny niż txt, to program albo się wywalił podczas kodowania, albo podczas dekodowania... Generalnie nwm co jest źle, ale stawiam, że to dla tego, że fstream albo nie przyjmuje większych plików, albo pliki te nie są kodowane w ASCII co prowadzi do wywalania się programu (to akurat mało prawdopodobne).

 

Tutaj zamieszczam kod:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

unsigned char klucz;

fstream openFile, saveFile;

string line;

int main(int argc, char * argv[])
{
    if(argc!=1)
    {
        if((string)argv[1]=="coding")
        {
            klucz = atoi(argv[2]);
            openFile.open(argv[3], ios::in);
            saveFile.open("coded.ac", ios::out);
            if(openFile.good() && saveFile.good())
            {
                while(getline(openFile, line))
                {
                    for(int a=0; a<=line.length()-1; a++)
                    {
                        saveFile<<(char)((char)line[a]+klucz);
                    }
                    saveFile<<endl;
                }
            }
        }
        if((string)argv[1]=="decoding")
        {
            klucz = atoi(argv[2]);
            saveFile.open(argv[3], ios::out);
            openFile.open(argv[4], ios::in);
            if(openFile.good() && saveFile.good())
            {
                while(getline(openFile, line))
                {
                    for(int a=0; a<=line.length()-1; a++)
                    {
                        saveFile<<(char)((char)line[a]-klucz);
                    }
                    saveFile<<endl;
                }
            }
        }
    }
    openFile.close();
    saveFile.close();
    return 0;
}

Proszę, pomóżcie mi znaleźć błąd! :>

3 odpowiedzi

+1 głos
odpowiedź 23 kwietnia 2015 przez jeremus Maniak (59,720 p.)
wybrane 1 maja 2015 przez jegor377
 
Najlepsza

musisz traktować pliki jako binarne - żadnych endl, getline

takie cos powinno działać

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

unsigned char klucz;


fstream openFile, saveFile;

char c;

int main(int argc, char * argv[])
{
    if(argc!=1)
    {
        if((string)argv[1]=="coding")
        {
            klucz = atoi(argv[2]);
            openFile.open(argv[3], ios::binary|ios::in);
            saveFile.open("coded.ac", ios::binary|ios::out);
            if(openFile.good() && saveFile.good())
            {

                while(openFile.read(&c,1))
                {
       
                  saveFile.put(c+klucz);

      

                }
            }
        }
        if((string)argv[1]=="decoding")
        {
            klucz = atoi(argv[2]);
            saveFile.open(argv[3], ios::binary|ios::out);
            openFile.open(argv[4], ios::binary|ios::in);
            if(openFile.good() && saveFile.good())
            {

                while(openFile.read(&c,1))
                {
                
                   saveFile.put(c-klucz);
   
                }
            }
        }
    }
    openFile.close();
    saveFile.close();
    return 0;
}

 

komentarz 1 maja 2015 przez jegor377 Stary wyjadacz (13,230 p.)
OOOO dzięki bro, pomogłeś mi bardzo! :D
+1 głos
odpowiedź 22 kwietnia 2015 przez Ursan Bywalec (2,920 p.)
Robisz swój plik gif mam rozumieć? Wpisujesz coś w notepadzie i zapisujesz jako *.gif?

Znak += klucz...

Jeśli pobierzesz klucz jako char, to bedziesz mial znak, a nie klucz (chyba, że mówimy tu o czymś innym niż szyfr Cezara)
komentarz 22 kwietnia 2015 przez jegor377 Stary wyjadacz (13,230 p.)
no tak, ale zmienne char przechowywane są jako cyfry i nie ma znaczenia czy to int czy char, bo znak+=klucz (gdyby znak=97 i klucz=97), oznacza tyle co 97+=97, czli znak=194. Co prawda to jest znak, ale tylko w momencie wyświetlenia tego na monitorze... w pamięci to jest taka sama liczba jak int, z tym, że ten typ char oznacza, że przy wyświetlaniu ma pokazać znak pod tym numerem, a nie liczbę... :>
komentarz 22 kwietnia 2015 przez jegor377 Stary wyjadacz (13,230 p.)
to musi być coś innego :> przy okazji nie tworzę pliku gif w notatniku tylko, w paincie :)
komentarz 22 kwietnia 2015 przez Ursan Bywalec (2,920 p.)

Fakt. Nie zauważyłem tego atoi.

Ale otwierasz plik z rozszerzeniem gif i tu jest błąd. Otwórz go np. notepadem i zobacz co w nim siedzi smiley

komentarz 22 kwietnia 2015 przez jegor377 Stary wyjadacz (13,230 p.)
no właśnie ja go chcę wczytać do programu i przerobić, ale kiedy go wczytuje i rozpoczynam obróbkę z zapisem do innego pliku, to program nagle z nie wiadomych przyczyn się wysypuje... :D i ja tego nie rozumiem, zaś do małych plików pisanych bezpośrednio w notatniku to jest ok, wszystko śmiga... :D
komentarz 23 kwietnia 2015 przez Ursan Bywalec (2,920 p.)
Powtarzam, abys otworzyl plik przed wyslaniem do programu za pomocą notepada++. Plik graficzny != plik textowy
0 głosów
odpowiedź 23 kwietnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Hmmm, conajmniej ciekawe, dobrze że dodadłeś opis bo trzeba by było sporo rozkminiać, o co chodzi w tym kodzie :P

Podobne pytania

–1 głos
2 odpowiedzi 3,362 wizyt
pytanie zadane 10 września 2016 w Systemy operacyjne, programy przez Wookiee Użytkownik (980 p.)
0 głosów
2 odpowiedzi 512 wizyt
pytanie zadane 11 stycznia 2018 w C i C++ przez migrad Nowicjusz (170 p.)
0 głosów
1 odpowiedź 355 wizyt
pytanie zadane 18 lipca 2017 w PHP przez delarudii Nowicjusz (140 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...