Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Odczytywanie i zapisywanie pakietu danych, dodatkowe dane znikąd.

Ostatnio zmodyfikowano 2016-05-01 19:43
Autor Wiadomość
Rashmistrz
Temat założony przez niniejszego użytkownika
Odczytywanie i zapisywanie pakietu danych, dodatkowe dane znikąd.
» 2016-05-01 17:39:25
W związku z tematem "Próbka danych binarnych.",
stworzyłem sobie samodzielnie program do tego celu.

Jednakże po jego wykonaniu w pliku wynikowym
znajdują się nadmiarowe bajty, których nie powinno być.

W pliku w przypadkowych miejscach
znajdują się pojedyncze dodatkowe bajty.

Plik wynikowy zamiast mieć 4096B zajmuje 4108B.

Pytanie... Skąd się biorą te dodatkowe bajty?
i jak naprawić ten niepożądany efekt?

Użyte przeze mnie polecenie:
binfile binfile.exe 0 4096 binfile.bin

// Tak. Użyłem programu na nim samym...

binfile.cpp :
C/C++
#include <fstream>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

int main( int argc, char * argv[] )
{
    if( argc < 5 )
    {
        char halp1[] = "/?";
        char halp2[] = "/help";
        if( argc == 1 ||( !strcmp( argv[ 1 ], halp1 ) || !strcmp( argv[ 1 ], halp2 ) ) )
        cout << " usage: binfile <file> <start> <amount> <extracted> [-c]\n"
        << " -c : cluster copying mode  (4kB)\n"
        << " <file> : readen file\n"
             << " <extracted> : file which contain extracted bytes\n";
        else
             cout << "not enough parameters. must be at least 2.\n";
       
        return 0;
    }
   
    cout << "Opening file \"" << argv[ 1 ] << "\"\n";
    ifstream readen_file( argv[ 1 ] );
    if( readen_file.is_open() )
         cout << "File succesfully opened" << '\n';
    else
    {
        cout << "File \"" << argv[ 1 ] << "\" don't exist" << '\n';
        return 0;
    }
   
    int start = atoi( argv[ 2 ] );
    int amount = atoi( argv[ 3 ] );
    if( amount < 1 || start < 0 )
    {
        if( amount == 0 )
        {
            cout << "No data copied. ;) Are you happy?\n";
            return 0;
        }
        cout << "<start> or <amount> musn't be negative!\n"
        << "<start> = " << start << ", " << "<amount> = " << amount << '\n';
        return 0;
    }
   
    cout << "Opening file \"" << argv[ 4 ] << "\"\n";
    ofstream written_file( argv[ 4 ] );
    if( written_file.is_open() )
         cout << "File succesfully opened/created" << '\n';
   
    // http://cpp0x.pl/kursy/Kurs-C++/Poziom-4/Poruszanie-sie-po-pliku-w-trybie-do-odczytu/476
    // http://stackoverflow.com/questions/5840148/how-can-i-get-a-files-size-in-c
    char cluster_mode[] = "-c";
    if( argc == 6 && !strcmp( cluster_mode, argv[ 5 ] ) )
    {
        cout << "Cluster mode defined!\n";
        amount *= 4096;
        start *= 4096;
    }
   
    readen_file.seekg( 0, std::ios::end );
    int size = readen_file.tellg();
    readen_file.seekg( 0 );
    if( size < amount )
    {
        cout << "Not enough data to copy\n"
        << "Nothing copied...\n";
        return 0;
    }
   
    if( start )
         readen_file.seekg( start );
   
    char * readen_bytes = new char[ amount ];
    readen_file.read( readen_bytes, amount );
    written_file.write( readen_bytes, amount );
    cout << "Data succesfully copied!\n";
    return 0;
   
}
P-147833
Monika90
» 2016-05-01 18:49:24
Powinieneś pliki otwierać w trybie binarnym.
P-147844
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2016-05-01 19:43:51
Dziękuję! :D
Dzięki Tobie wszystko gra.
_________________________

Poprawione linijki:
ifstream readen_file( argv[ 1 ], ios::binary );
,
ofstream written_file( argv[ 4 ], ios::binary );
.
P-147850
« 1 »
  Strona 1 z 1