我正在编写一个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);
}
}
我该怎么办?如果我应该使用文件的大小,我怎么能得到它?
答案 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 之前的字节。