C++에서 ifstream을 사용하여 큰 파일 (~ 5GB)을 읽으려고합니다. 64 비트 OS를 사용하고 있기 때문에 문제가 아닌 것으로 생각했습니다. 아직도, 나는 segfault를 얻는다. 모든 것은 작은 파일 인 으로 잘 실행되므로 문제가있는 곳이 확실합니다.Segfault가 64 비트 ifstream으로 큰 파일을 읽는 중 데비안
g ++ (4.4.5-8) 및 libstdC++ 6 (4.4.5-8)을 사용하고 있습니다.
감사합니다.
코드는 다음과 같다 :
void load (const std::string &path, int _dim, int skip = 0, int gap = 0) {
std::ifstream is(path.c_str(), std::ios::binary);
BOOST_VERIFY(is);
is.seekg(0, std::ios::end);
size_t size = is.tellg();
size -= skip;
long int line = sizeof(float) * _dim + gap;
BOOST_VERIFY(size % line == 0);
long int _N = size/line;
reset(_dim, _N);
is.seekg(skip, std::ios::beg);
char *off = dims;
for (long int i = 0; i < N; ++i) {
is.read(off, sizeof(T) * dim);
is.seekg(gap, std::ios::cur);
off += stride;
}
BOOST_VERIFY(is);
}
세그먼트 폴트는 = I에 대한 is.read
라인 187,664이다. T는 float이고 한 번에 dim = 1000 수레를 읽었습니다. segfault가 발생하면 i * stride가 크기보다 작아 파일 끝에 도달하지 못합니다.
희미 여기
void reset (int _dim, int _N)
{
BOOST_ASSERT((ALIGN % sizeof(T)) == 0);
dim = _dim;
N = _N;
stride = dim * sizeof(T) + ALIGN - 1;
stride = stride/ALIGN * ALIGN;
if (dims != NULL) delete[] dims;
dims = (char *)memalign(ALIGN, N * stride);
std::fill(dims, dims + N * stride, 0);
}
파일을 어떻게 읽으며 세분화 오류가 어디에 있습니까? –
관련 코드를 게시하십시오. – Joe
'희미한 빛 '이란 무엇입니까? 어떻게 할당 되나요? 당신은 그 끝을 지나고 있지 않다는 확신합니까? – Mat