동적 배열의 이진 파일에 쓰려고합니다.C++ 동적 배열을 파일에 쓸 수 없습니다.
여기 내 코드입니다 :
FILE* file;
std::ofstream outStream;
file = fopen("mesh1.model", "w");
outStream = std::ofstream(file);
unsigned numTriangles;
float *vertices;
float *uvs;
unsigned degree = 0;
numTriangles = 2 * std::pow(4, degree); // numTriangles == 2 in this case
vertices = new float[9 * numTriangles];
uvs = new float[6 * numTriangles];
vertices[0] = -1.0f;
vertices[1] = 0.0f;
vertices[2] = 1.0f;
uvs[0] = 0.0f;
uvs[1] = 0.0f;
[....]
vertices[15] = 1.0f;
vertices[16] = 0.0f;
vertices[17] = -1.0f;
uvs[10] = 1.0f;
uvs[11] = 1.0f;
outStream.write((const char*)numTriangles, sizeof(numTriangles));
// Get runtime error on the line after this comment [access violation] (VS2013)
outStream.write((const char*)&(vertices), sizeof(float) * 9 * numTriangles);
outStream.write((const char*)&(uvs), sizeof(float) * 6 * numTriangles);
delete[] vertices;
delete[] uvs;
fclose(file);
file = fopen("mesh1.model", "r");
내가 유사한 문제와 과거의 코멘트를 보았다,하지만 그들은 도움이되지 않았다.
그들 중 한 명은 시도했지만 도움이되지 않은 reinterpret_cast
을 사용했습니다.
'reinterpret_cast'는 필요하지 않지만 둘 다'std :: unique_ptr'입니다. 우리는 우리 자신의 기억을 관리 할만큼 똑똑 하죠? ... 어쩌면,하지만 우리는 이러한 기능을 사용합니다. 왜냐하면 더 장황한 대안 인 것보다 * 더 안전하기 때문입니다. C 스타일의 캐스트를 사용하면 기대하지 않았던 방식으로 캐스팅을 결정할 때 모든 종류의 문제가 발생할 수 있습니다 (https://anteru.net/2007/12/18/200/). C++ 스타일의 캐스트를 사용하면 캐스트로 러시아어 룰렛을 연주하는 대신 원하는 유형의 캐스트를 정확하게 지정할 수 있습니다. 더 안전하고 놀라움이 적기 때문에 더 좋습니다. – cdhowie
감사합니다.이 방법이 효과가 있으며 fwrite를 시도해 보겠습니다. – MichaelMitchell
@cdhowie'ofstream' 바이트 블록 쓰기 인터페이스는 여기서 러시아어 룰렛을 재생하는 인터페이스입니다. 문제는 내가 작성한 데이터를 깔끔하게 재 해석하거나 단순히 C 스타일로 캐스팅했는지 여부가 아닙니다. 중요한 점은 데이터와 크기가 일관성이 있는지 확인해야한다는 것입니다. 이는 인터페이스의 개념적 약점입니다. 여러분은 적어도 작성된 객체의 크기를 계산하는 인터페이스와 다중 사본을 작성하는 추가 선택 매개 변수를 기대할 수 있었지만'ofstream'은'fwrite'보다 낫지 않고 불필요한 쓸모없는 잡동사니를 추가했습니다. –