C ++中的Exe文件的结尾

时间:2012-02-18 08:41:52

标签: c++ iostream exe

我正在编写一个C ++程序来读取exe文件。我写了它,我在一个文本文件而不是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 个答案:

答案 0 :(得分:2)

您必须使用std::ios::binary模式标志打开文件流。

答案 1 :(得分:2)

由于James McNellis指出您需要以二进制模式打开文件:尝试以下内容:

#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 :(得分:2)

除了以二进制模式打开文件外,当前代码还有一个细微的错误,它会导致文件中的最后一个字符被读取两次。问题是myFile.eof()调用没有按照您的想法执行。当你在文件末尾时,它不会告诉你。它告诉您,您已尝试读取超出文件的末尾。在C ++中编写read-until-eof循环的惯用方法是:

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

get会返回istream引用,在此上下文中,该引用可隐式转换为bool,用于表示没有更多数据可供读取。

答案 3 :(得分:1)

这里只是预感,但我怀疑你实际上正在正确阅读整个文件,但测量错误。

文件读取(使用二进制模式)不会在0字节上停止,但会有几种与字符串相关的方法。

例如,您无法使用strlen()测量二进制“blob”的大小,您无法使用strcpy()复制它。

如果没有看到存储和测量数据的实际方式,很难看出出现问题的地方,但我强烈怀疑,如果您正在使用二进制模式,那么您实际上正在正确读取整个文件。

答案 4 :(得分:0)

我发现了我的错误,该程序读取了所有字节,但我cout表示vector<char>中的字节,所以很明显我只看到 0x00 之前的字节。