我认为我的代码中有一个愚蠢的错误,但无法找到它。
我尝试读取二进制文件并扫描每4个字节以查找特定模式以分开大文件。
std::string* filename = new std::string((args > 1?argv[1]:"data.bin"));
std::cout << filename;
int filenumber = 0;
std::ifstream myfile (*filename, std::ios::binary);
if (myfile.is_open())
{
bool newfile = true;
std::streampos filebegin = 0;
std::streampos fileend = 0;
char* buffer = new char[4];
int oldpos = -1;
while ( myfile.good() )
{
myfile.get(buffer,4); // get character from file
int currpos = myfile.tellg();
// std::cout << currpos << std::endl;
if (myfile.good() && buffer[0] == 82 && buffer[1] == 73 && buffer[2] == 70 && buffer[3] == 70){
if(newfile){
newfile = false;
filebegin = myfile.tellg()-std::streampos(3);
std::cout << "file begin" << std::endl;
}
else{
newfile = true;
fileend = myfile.tellg()-std::streampos(4);
char* filebuffer = new char[fileend-filebegin];
myfile.seekg(filebegin);
myfile.get(filebuffer,fileend-filebegin);
std::ostringstream os;
os << "file" << filenumber << ".bin";
std::ofstream myofile (os.str());
filenumber++;
if (myofile.is_open()){
std::cout << "file " << filenumber << std::endl;
myofile << filebuffer;
}
myofile.close();
delete[] filebuffer;
}
}
myfile.seekg(myfile.tellg()-std::streampos(2));
oldpos = currpos;
}
myfile.close();
}
else std::cout << "Unable to open file";
但经过一些循环后,它被困在3387位置。
有人知道我做错了吗?
我使用TDM-GCC进行编译。 编辑: 它甚至没有达到我搜索的模式。
问候 芥末
答案 0 :(得分:1)
也许你应该替换
myfile.get(filebuffer,fileend-filebegin);
与
myfile.read(filebuffer,fileend-filebegin);
然后再试一次。原因已经由@uesp解释了。
答案 1 :(得分:0)
最好查看ifstream::get(buffer, n)
的{{3}}。重要的一点是:
所以一个问题是你实际上每次只读取3个字节,并且在第一次遇到换行符时你将停止读取字节。