使用file.get()和file.seekg()后,file.tellg()卡在同一个数字上

时间:2014-10-12 16:48:43

标签: c++ ifstream

我认为我的代码中有一个愚蠢的错误,但无法找到它。

我尝试读取二进制文件并扫描每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进行编译。 编辑: 它甚至没有达到我搜索的模式。

问候 芥末

2 个答案:

答案 0 :(得分:1)

也许你应该替换

myfile.get(filebuffer,fileend-filebegin);

myfile.read(filebuffer,fileend-filebegin);

然后再试一次。原因已经由@uesp解释了。

答案 1 :(得分:0)

最好查看ifstream::get(buffer, n)的{​​{3}}。重要的一点是:

  • 读取 n-1 个字符
  • 读取第一个换行符(\ n)

所以一个问题是你实际上每次只读取3个字节,并且在第一次遇到换行符时你将停止读取字节。