2012-09-23 7 views
1

Ubuntu 11.04에서 NetBeans 6.9를 사용하여 C++로 개발 중입니다. I는 입력 및 출력 파일 이름 문자열을 선언하고 파일을 입력 파일 이름은 애플리케이션에 대한 입력 인수로서 기존 파일의 이름을 할당ifstream 출력을 위해 파일을 만들고 열지 않음

ifstream fpInputFile, fpOutputFile; 
string inputFileName="", outputFileName=""; 

따라서 스트림. 출력 파일 이름은 "_output"이 마지막 기간 전에 삽입된다는 점을 제외하고는 입력 이름과 동일하게 지정됩니다. 따라서 출력은 입력이있는 디렉토리와 동일한 디렉토리에 기록됩니다. 또한

su netbeans 

으로 netbeans를 시작하므로 IDE에 디렉토리에 대한 루트 권한이 있습니다. 파일을 열어서 파일이 열렸는지 확인하려고합니다.

fpInputFile.open(inputFileName.c_str(), ifstream::in); 
fpOutputFile.open(outputFileName.c_str(), ifstream::out); 
if (!(fpInputFile.is_open())) throw ERROR_OPENING_FILE; 
if (!(fpOutputFile.is_open())) throw ERROR_OPENING_FILE; 

입력 파일이 성공적으로 열리지 만 출력 파일은 열리지 않습니다.

왜 출력 파일이 쓰기 위해 열리지 않는지 확인하는 데 도움이 될 것입니다.

+2

'ifstream'의 'i'는 입력을 의미하는 것을 알고 있습니까? – paxdiablo

+0

아! 그것이 문제였습니다. 나는 내가 입을 열었다는 것을 깨닫지 못했다. 나는 그것을 o로 바꾸었고 문제가 해결되었습니다. 매우 감사합니다! – OtagoHarbour

답변

3

명백한 문제는 std::ifstream이 아닌 std::ofstream을 사용하여 파일을 여는 것이 었습니다. 읽기를 위해 열려있는 한 std::ifstream에 쓸 수있는 방법이 있지만 실제로 스트림에 쓰는 데 도움이됩니다. 예를 들어 std::streambuf 인터페이스를 직접 사용하거나 std::streambuf을 사용하여 std::ostream을 생성 할 수 있습니다.

더 흥미로운 질문은 : std::ios_base::in | std::ios_base::out이 열린 모드로 사용될 때 파일이 쓰기 위해 열리지 않는 이유는 무엇입니까? std::ifstream은 자동으로 std::ios_base::in을 추가합니다. 모드 std::ios_base::in | std::ios_base::out은 파일을 만들지 않지만 기존 파일을 성공적으로 열어줍니다. 당신이 정말로 출력을위한 파일을 열려면 std::ifstream를 사용하려는 경우 이는 잠재적으로 사용할 필요가 존재하지 않거나 std::ios_base::out | std::ios_base::trunc 또는 std::ios_base::out | std::ios_base::app :

는을 존재하는 경우
  • 파일을 강제 이전 만들거나 절단 할 당신이 읽기와 쓰기 모두를위한 파일을 열려면 그냥 std::ofstream을 사용하거나 오프 최선의 것을,

내 개인적인 추측하지만, 모든 경우에 파일을 추가 할 쓰기를 강제

  • 후자 std::fstream (단, 파일이 없으면 std::ios_base::trunc 또는 std::ios_base::app을 추가하여 파일을 만듭니다.

  • +0

    도와 주셔서 감사합니다. – OtagoHarbour

    4

    출력 파일을 ifstream 대신 ofstream으로 선언하십시오.

    입력 파일과 출력 파일 모두에 fstream을 사용할 수도 있습니다.

    +0

    대단히 감사합니다. i를 o로 바꾸면 문제가 해결됩니다. 다시 한번 감사드립니다. – OtagoHarbour