Odczytywanie i zapisywanie pakietu danych, dodatkowe dane znikąd.
Ostatnio zmodyfikowano 2016-05-01 19:43
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 : #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'; 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; } |
|
Monika90 |
» 2016-05-01 18:49:24 Powinieneś pliki otwierać w trybie binarnym. |
|
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 ); . |
|
« 1 » |