문제를 일으키는 데 정말로 문제가 있습니다. 나는 uint32_t *에 전체 바이너리 파일을 읽고 저장하고있다. 그런 다음 필요한 데이터 세그먼트의 시작을 확인하십시오. 그러나 세그먼트의 시작 부분에 배열 변경 사항을 전달하지 않았는지 확인하기위한 수표를 추가하면 이유를 알 수 없습니다.일치하지 않는 이진 데이터 또는 조건 문 데이터 변경
#include <iostream>
#include <string.h>
#include <typeinfo>
#include <fstream>
#include <vector>
#include <stdint.h>
#include <stdexcept>
using namespace std;
int* binmem = new int[32];
streampos size; // size of memblock
int blocklength; // length memblock
uint32_t * memblock; // all data
int startpos;
int endpos;
int x;
void NewParticle() {
startpos = 0;
while (memblock[startpos]!= 0xff000000) { // 4278190080
if (startpos > blocklength) {
//cout << "nah";
//x++;
throw invalid_argument("No start of particle");
}
startpos++;
}
}
int main(int argc, const char *argv[]) {
ifstream file(argv[0], ios::in | ios::binary | ios::ate);
if (file.is_open()) {
size = file.tellg();
blocklength = (size/4) + (size % 4 == 0 ? 0 : 1);
memblock = new uint32_t[size/4 + (size % 4 == 0 ? 0 : 1)];
file.seekg(0, ios::beg);
file.read(reinterpret_cast<char*>(memblock), size);
file.close();
NewParticle();
} else
cout << "Unable to open file";
return 0;
}
startpos는 NewParticle()에 추가하는 조건문에 따라 다릅니다. 예외를 던지면 1109가 나오는데, 조건을 완전히 빼면 812가됩니다. "nah"를 사용하면 while 루프가 영원히 실행되고 x ++ 문을 사용하면 세그먼트 오류가 발생합니다. 감사합니다.
나는 당신이 무슨 말을하는지 잘 모르겠다. 'if (startpos> blocklength)'내부에 아무것도 없으면 배열의 데이터를 변경하지만,'throw '를 주석 처리하여 루프를 종료 할 수 없다면 대신'return'을 시도하거나' '그 자체. 당신이 "X를 준다"고 말할 때 당신은 무엇을 의미합니까? –
@RetiredNinja 닫는 괄호를 잊어 버렸습니다. 미안하지만 문제는 if 문 안쪽의 아무 것도 데이터를 변경하지 말아야한다는 것입니다. while 루프는 항상 동일한 startpos 값으로 동일한 파일에 대해 같은 지점에서 멈추어야합니다. while 루프에 if 문을 삽입하면 startpos 값이나 함수 비헤이비어가 변경되고 이유는 알 수 없습니다. –
if 문은 무한 루프를 벗어나는 동시에 주석을 제거하지 않는 한 아무 것도 변경하지 않습니다. 그 값이 파일에 존재하지 않는다고 생각 했습니까? 오른쪽 엔디안 값을 찾으십니까? [여기] (http://coliru.stacked-crooked.com/a/bbf55a3d3d044db6)는 파일의 임의의 위치에 해당 값을 쓰고 다시 찾는 예제입니다. 아마 도움이 될지 모르지만 데이터 파일에 액세스 할 필요없이 추측 이외의 것을 제공 할 수는 없습니다. –