fseek没有读取所有数据?

时间:2011-03-29 19:55:17

标签: c++ installer

我正在制作一个c ++安装程序,我已将要提取的文件和要在程序中提取的文件的8字节文件大小附加到可执行文件中。我的程序退出文件读取错误,出错了什么?要注意我除了我今天学到的东西之外,对c文件管理没有任何了解。我正在写文件test_before.tar.gz,这是161个字节,可执行文件长12335个字节,filesize文件长8个字节,包含0000161.怎么回事?如果需要,请询问更多信息。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int main(int argc, char* argv[])
{
    cout << "Opening the executable as read-only!" << endl;
    FILE *exeFile; // The executable file pointer
    FILE *outFile; // The file to write pointer

    // Check whether a file name was supplied
    if(argc < 2)
    {
        cout << "Please enter the file to write!" << endl;
        return 1;
    }

    // Open the executable as read-only
    if((exeFile = fopen(argv[0], "rb")) == 0)
    {
        cout << "Error opening the executable!" << endl;
        return 1;
    }

    cout << "Getting the executables size!" << endl;

    // Get the files size
    fseek(exeFile, 0, SEEK_END);
    int size = ftell(exeFile);

    cout << "Reading ofset!" << endl;   

    // Read the ofset bytes contained in the last 7-bytes
    char filesize_char[9];
    fseek(exeFile, -8, SEEK_END);
    fgets(filesize_char, 9, exeFile);

    // Convert
    int filesize = atoi(filesize_char);
    int ofset = (size - filesize) - 8;

    cout << "The ofset size is " << ofset << " bytes!" << endl;
    cout << "The file size is " << filesize << " bytes!" << endl;

    cout << "Reading the file to extract!" << endl;

    // Create the variable to contain the file and goto the ofset
    char* contents = new char[filesize + 1];
    fseek(exeFile, ofset, SEEK_SET);

    // Read the file to extract
    if(fread(contents, sizeof(char), filesize + 1, exeFile) != sizeof(contents))
    {
        // Error has occured
        if(feof(exeFile)) {
            cout << "Premature end of file!" << endl;

            // Delete variables so they dont "leak"
            fclose(exeFile);
            delete[] contents;

            return 1;
        } else {
            cout << "File read error!" << endl;

            // Delete variables so they dont "leak"
            fclose(exeFile);
            delete[] contents;

            return 1;
        }
    }

    cout << "Writing the file to " << argv[1] << "!" << endl;

    // Write the file to extract
    if((outFile = fopen(argv[1], "wb")) == 0)
    {
        cout << "Error opening the file to write!" << endl;

        // Delete variables so they dont "leak"
        fclose(exeFile);
        fclose(outFile);
        delete[] contents;

        return 1;
    }

    fwrite(contents, 1, sizeof(contents), outFile);

    //delete variables
    fclose(exeFile);
    fclose(outFile);
    delete[] contents;

    return 0;
}

1 个答案:

答案 0 :(得分:1)

根本不需要while循环。毕竟,您已经分配了包含所有数据的内存。将文件指针移动到数据开头fseek(exeFile, ofset, SEEK_SET),然后使用fread将其整体读取,然后使用fwrite将其写入outFile

您应该使用exeFileoutFile标记打开"rb""wb",否则您的代码只会对文本数据有效。