Odczyt pliku binarnego.

0

Dlaczego poniższy kod ucina kilka KB pliku? Czy da się w taki sposób zrealizować kopiowanie pliku?

#include <fstream>
#include <conio.h>
using namespace std;

int main()
{
    ifstream file("1.exe", ios::binary);
    ofstream file2("2.exe", ios::binary);
    
    char c;
    while (file >> c)
        file2 << c;
    file.close();   
    file2.close();
    getch();
    return true;
}

Pozdrawiam.

0

Chyba dlatego, ze to jest plik binarny i może zawierać zera, a Tobie jak takie odczyta to przerywa petle. Daj tam:

while (is.good())


Opolski Portal Programistyczny
http://programowanie.opole.pl
http://protechnologia.pl

0

Zmodyfikowałem w ten sposób, lecz to samo, ucina kilka KB(tyle samo co w przypadku pierwszego kodu).
A co do zera to wydaje mi się, że while nie sprawdza wartości tylko flagę strumienia(powodzenia pobrania lub nie), ale mogę się mylić.

#include <fstream>
#include <conio.h>
using namespace std;

int main()
{
    ifstream file("qwe.exe", ios::binary);
    ofstream file2("2.exe", ios::binary);
    
    unsigned char c;
    while (file.good())
    {
        file >> c;  
        file2 << c;
    }
    file.close();   
    file2.close();
    getch();
    return true;
}
1

wczytując file>>c pomijasz wszystkie "białe znaki", spacje tabulacje entery i jeszcze kilka innych.
W przypadku plików binarnych nie możesz tego robić, trzeba odczytywać znak po znaku lub blokami.

int ch;
while ((ch=file.get())!=EOF) file2.put(ch);
0
_13th_Dragon napisał(a)

wczytując file>>c pomijasz wszystkie "białe znaki", spacje tabulacje entery i jeszcze kilka innych.
W przypadku plików binarnych nie możesz tego robić, trzeba odczytywać znak po znaku lub blokami.

int ch;
while ((ch=file.get())!=EOF) file2.put(ch);

Dziękuję, działa. Gdy zapisany plik *.exe otwierałem za pomocą edytora tekstu to wyglądał identycznie jak oryginał(mam na myśli tutaj białe znaki, odstępy), nie wpadłbym na to:)
Pozdrawiam!

0

Byłem przekonany, że gdy sie otworzy plik w trybie binarnym to i operator >> będzie też działać w tym trybie. Sam nie sprawdzałem, bo zawsze stosowałem get().


Opolski Portal Programistyczny
http://programowanie.opole.pl
http://protechnologia.pl

0

W C/C++ otwarcie pliku w trybie binarnym oznacza wyłącznie brak automatycznej konwersji znaków nowej linii, 666 >> plik nadal zapisuje liczbę tekstowo.

0

*plik << 666.

1 użytkowników online, w tym zalogowanych: 0, gości: 1