конец файла exe в C ++ - PullRequest
       5

конец файла exe в C ++

0 голосов
/ 18 февраля 2012

Я пишу программу на C ++ для чтения исполняемого файла. Я написал это, и я проверяю это на текстовом файле вместо файла EXE. это было правдой.

когда я тестирую его с помощью exe-файла, я понимаю, что в моем exe-файле содержится значение 0x00 (не в его конце). поэтому мой цикл while останавливается до конца файла, потому что я использовал:

class A{
private:
ifstream myFile;
void Read(char *filename)
};

void A::Read(char *str)
{
myFile.open(str,ios::binary);

    while (!myFile.eof())
    {
       InputFile.get(ch);
       myString.push_back(ch);
    }
}

что мне делать? если я должен использовать размер файла, как я могу получить его?

Ответы [ 5 ]

2 голосов
/ 18 февраля 2012

Помимо открытия файла в двоичном режиме, в текущем коде есть небольшая ошибка, из-за которой последний символ в файле будет прочитан дважды. Проблема в том, что вызов myFile.eof() не делает то, что вы думаете. Он не говорит вам, когда вы находитесь в конце файла. Он говорит вам, что вы пытались прочитать за концом файла. Идиоматический способ написания цикла read-before-eof в C ++:

while (myFile.get(ch))
    myString.push_back(ch);

get возвращает ссылку istream, которая в этом контексте неявно преобразуется в bool и используется для указания того, что больше нет данных для чтения.

2 голосов
/ 18 февраля 2012

Как Джеймс МакНеллис указал, что вам нужно открыть файл в двоичном режиме: Попробуйте что-то вроде следующего:

#include <iostream>
#include <fstream>

int main()
{
    std::ifstream in("main.obj", std::ios_base::binary);

    std::streamsize bytes_read = 0;
    if (in.is_open())
    {
        while (!in.eof())
        {
            char buf[1024];

            // Use unformatted read.
            in.read(buf, 1024);

            if (in.gcount() > 0)
            {
                // The first 'in.gcount()' chars in
                // 'buf' were read.
                bytes_read += in.gcount();
            }
        }
    }
    in.close();

    std::cout << "bytes read=" << bytes_read << "\n";

    return 0;
}

РЕДАКТИРОВАТЬ:

Пример изменен наиспользуйте get():

#include <iostream>
#include <fstream>

int main()
{
    std::ifstream in("main.obj", std::ios_base::binary);
    std::streamsize bytes_read = 0;
    if (in.is_open())
    {
        while (!in.eof())
        {
            in.get();
            if (1 == in.gcount())
            {
                bytes_read++;
            }
        }
    }
    in.close();
    std::cout << "bytes read=" << bytes_read << "\n";
    return 0;
}

Проверено и работает правильно.

2 голосов
/ 18 февраля 2012

Вы должны открыть поток файлов с флагом режима std::ios::binary.

1 голос
/ 18 февраля 2012

Здесь только догадка, но я подозреваю, что вы на самом деле правильно читаете весь файл, но измеряете его неправильно.

Чтение файла (в двоичном режиме) не остановится на 0-байтовом байте, но есть несколько методов, связанных со строками.

Например, вы не можете измерить размер двоичного «блоба» с помощью strlen (), вы не можете скопировать его с помощью strcpy ().

Не видя фактического способа хранения и измерения данных, трудно понять, где что-то идет не так, но я сильно подозреваю, что вы действительно правильно читаете весь файл, если используете двоичный режим.

0 голосов
/ 18 февраля 2012

Я нашел свою ошибку, Программа прочитала все байты, но я cout, что байтов в vector<char>, так что очевидно, что я видел только байты до 0x00 .

...