삽질 – 003 :: 파일오픈시 플래그값 에러

file.open(strFilename.c_str(), ios::out || ios::trunc);
에 따른 에러코드

no matching function for call to `
std::basic_fstream >::open(const char*, bool)’
/usr/include/c++/3.2.2/fstream:557: candidates are: void
std::basic_fstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode =
(std::ios_base::in | std::ios_base::out)) [with _CharT = char, _Traits =
std::char_traits]

틀린게 없어 보이지만…(나는 없어 보였다.. T_T)
ios::out || ios::trunc 의 결과는 bool 값이 된다. || 가 or 연산자이기 때문이다.

VC++ 7.0 warnning level 3 에서는 문제없이 컴파일 된다. bool 로 나온값을 어떻게 처리하는지는 모르겠다. 자동으로 32bit 데이타 타입으로 변환되고 그값이 다시 그 플래그 값으로 변환이 되는게 아닐까 한다.

저 코드는

file.open(strFilename.c_str(), ios::out | ios::trunc);

으로 수정해서 비트연산을 하게 해줘야 된다.
후….이건 정말 삽질에 어울리는 포스팅인듯..(이른바 주옥같은 삽질들)

나와 같은 삽질을 하고 그에 대한 답을 준 사람들
http://www.spinics.net/lists/gcchelp/msg05558.html

마틴에게 감사를…
Thx Martin

ps.
왜 틀렸는지 알고 나서 보면.. 저 위의 에러코드에 답이 들어있다.
….젠장!

삽질 – 001 :: 파일오픈은 정상인데 이상하게 파일이 않읽어질때

오늘은 삽질

간단한 파일입력코드를 만드는중에 파일 사이즈를 알아야 할일이 있었다. 그래서 간단하게 오프셋을 ifstream::beg(파일의 처음)의 값과 ifstream::end(파일의 마지막) 값의 차이로 크기를 구하고 나서 파일전체를 메모리에 올리는 코드를 짰다.

근데 실제로 돌려보니 파일의 내용을 전혀 읽지 못하는것이다. 디버거로 값을 확인해 보니 read 함수를 호출하는것 까지도 전혀 문제가 없는데 파일의 내용자체는 전혀 가져오지 못하는것… 코드는

[CODE]file.seekg(0, ifstream::beg );
ifstream::pos_type startPos = file.tellg();
file.seekg(0, ifstream::end );
ifstream::pos_type lastPos = file.tellg();
m_nFilesize = (int)(lastPos-startPos);[/CODE]

문제가 된 코드는 요렇게 생겼었는데…
한시간 동안(….T_T) 살펴본 결과 file.seekg(0, ifstream::end ); 요 코드에서 파일 오프셋을 마지막으로 옮겨버려서 정작 read를 호출했을 때는 읽을 데이타가 없었던것…
코드를

[CODE]file.seekg(0, ifstream::end );
ifstream::pos_type lastPos = file.tellg();
file.seekg(0, ifstream::beg );
ifstream::pos_type startPos = file.tellg();
m_nFilesize = (int)(lastPos-startPos);[/CODE]

으로 수정해서 다시 파일의 처음으로 오프셋이 오게 해주니 해결….

후….삽질도 데이타베이스화 할 필요성을 느낀다.

ps.
사실 “파일오픈은 정상인데 이상하게 파일이 않읽어질때” 의 진정한 삽질의 상황이라면
“알고보니 파일에 내용이 하나도 없을때” 가 아닐까…