2016-10-22 12 views
0

ファイルに書き込むときにいくつか問題があります。 このプログラムの主な目的は、exeファイルからすべてのデータを読み込み、別のexeファイルに書き込んだ後に実行することです。 問題は、新しいファイルを書き込むときに、あまりにも多くのビットを書き込むことです。たとえば、私は45568(n = 45568)バイトを読んでいますが、新しいファイルには45800バイトしかありません。理由はわかりません。Ofstream writting too many bytes

#include <fstream> 
#include <iostream> 

int main(int argc, char** argv) 
{ 
    using namespace std; 

    ifstream file; 
    file.open("a.exe", istream::in | ios::binary); 

    std::streampos fsize = 0; 
    fsize = file.tellg(); 

    file.seekg(0, std::ios::end); 
    fsize = file.tellg() - fsize; 
    file.close(); 

    int n = fsize; 
    file.open("a.exe", istream::in | ios::binary); 
    std::cout << n << " " << endl; 

    int z=0; 
    char *p = new char[n+1]; 
    for (int i = 0;i < n;i++) 
    { 
     char ch; 
     file.get(ch); 
     p[i] = ch; 
    } 
    file.close(); 
    ofstream g; 
    g.open("b.bin"); 
    std::cout << n; 
    g.write(p, n); 

    return 0; 
} 
+1

はまた、あなたの全体のプログラムは、に簡素化することができます。 – user4581301

+0

は同じファイルです。私は質問を投稿したときにファイルの名前を変更するのを忘れました。 –

答えて

3

変更この行:

のWindows(およびレガシーDOS、 and many other legacy environments)に
g.open("b.bin", istream::out | ios::binary); 

、テキストモードで開いたファイルは、最後のための特別な治療を受ける:

g.open("b.bin"); 

は、このようにするには行番号:\n。 Windowsがテキストモードファイルを書き込むとき、すべて\nの文字がファイル\rに続いて\nとして書き込まれます。同様に、テキストモードでファイルを読むと、\r\nシーケンスが\nに変換されます。バイナリモードでファイルを開くと、この変換動作はすべてオフになります。私は再現することができないよ同じファイル上で動作し、オープンコールの両方を持っていたら

void main(int argc, char** argv) 
{ 
    ifstream in; 
    ofstream out; 
    in.open("a.exe", istream::in | ios::binary); 
    out.open("b.bin", istream::out | ios::binary); 

    while (in.rdstate() == in.goodbit) 
    { 
     char c; 
     if (in.get(c)) 
     { 
      out.write(&c, 1); 
     } 
    } 
} 
+0

多くの感謝!それは動作します –

+0

@AdrianPopescu - 答えがあなたのために働く場合、緑のチェックを与えることによって答えを "受け入れる"ことを忘れないでください。 – selbie