첫 번째 버그 : 입력 파일을 두 번 여는 중입니다. 두번째 오픈 요청 동작합니다 (open
부재에 직접 호)에 관한 표준 C++ 당 :
C++ 11 § 27.9.1.9 [ifstream.members/3]
void open(const char* s, ios_base::openmode mode = ios_base::in);
효과 : rdbuf()->open(s, mode | ios_base::in)
으로 전화하십시오. 해당 함수 이 null 포인터를 반환하지 않으면 clear()를 호출하고 은 setstate (failbit) (ios_base :: failure (27.5.5.4)를 throw 할 수 있음)을 호출합니다.
따라서 질문 하시겠습니까? rdbuf()->open(...)
은 무엇을합니까? 이 표준에 따라, 다시 한 번 버퍼링, 그리고에 대한 음, std::ifstream
는 filebuf
을 사용
C++ 11 §27.9.1.4 [filebuf.members/2]
basic_filebuf<charT,traits>* open(const char* s, ios_base::openmode mode);
효과 : is_open()
! = false이면 null 포인터을 반환합니다. 그렇지 않으면 필요에 따라 filebuf를 초기화합니다. ...
간단히 말해서 스트림이 페일 - 상태가되어 모든 데이터 관련 작업이 그 시점에서 완전히 실패하게됩니다.
두 번째 버그 : 루프 조건부 표현식에서 .eof를 부적절하게 사용합니다. 첫 번째 버그를 수정하면이 문제를 해결할 수 있습니다. 이것이 올바르게 수행되지 않는 이유는 여기서 설명 할 수있는 것보다 훨씬 나은 다음의 질문에 설명되어 있습니다.
Why is iostream::eof inside a loop condition considered wrong?
것은, 스트림의뿐만 아니라 EOF 상태를 당신의 IO 작업을 확인, 말 충분하다. 그 습관에 빠져서 그것에 충실하십시오.모두 고정
, 코드가 그대로 줄일 수있다 단순히이 : 당신이 더 강력한 코드를 촬영하는 경우 분명히
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::ifstream inputFile("testfile1.txt");
std::string str;
while (std::getline(inputFile, str))
std::cout << str << std::endl;
}
, 당신은 아마도 거기에 처리 일부 오류를 수행 할 뭔가 같은 :
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
int main()
{
std::ifstream inputFile("testfile1.txt");
if (!inputFile)
{
std::cerr << "Failed to open file\n";
return EXIT_FAILURE;
}
std::string str;
while (std::getline(inputFile, str))
std::cout << str << std::endl;
}
관련 없음 : 파일을 두 번 열었습니까? – WhozCraig
아니요, 매우 관련이 있습니다. 동일한 파일을 두 번 열면 버그가 발생합니다. 두 번째'open()'은 실패하고 파일 스트림에'fail' 비트를 설정합니다. 여기 두 번째 버그는 인기있는 [while eof bug]입니다 (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong). –
@SamVarshavchik 몇 분 전에 루프 조건부의 논리가 지금의 상황에 대한 반대 입장 이었기 때문에 분명히 코드가 변형되었습니다. 그림을 이동. – WhozCraig