2013-07-25 2 views
1
std::ifstream fin; 
fin.open("file.txt", std::ios::in); 
std::cout << fin.is_open(); 

이 코드는 false을 인쇄하므로 파일이 열리지 않습니다. 이유를 확인하는 방법. 어쩌면 fin 개체에서 오류 메시지가 표시됩니까? 이유는 파일이 이미 쓰기 위해 열렸습니다. 하지만 독서를 위해 열어보고 싶습니다. 읽기 및 쓰기 모두 파일을 열 수 있습니까?파일이 열리지 않는 이유를 확인하는 방법은 무엇입니까?

저는 리눅스를 사용하고 있습니다. strerror(errno)을 사용하면 오류가 발생합니다. 해당 파일 또는 디렉토리가 없습니다.하지만 해당 파일이 존재합니다. 어쩌면 다른 개체를 사용하여 이미 열었 기 때문에 오류가 있습니까? C API를 사용하여 이미 열었습니다. 그러므로 fin 열 수 없습니다. 이미 열려있는 파일을 열려면 어떻게해야합니까?

+0

C++에서는 [make_error_code] (http://www.cplusplus.com/reference/ios/io_errc/make_error_code/) 함수를 사용합니다. –

+0

'지느러미'의 종류는 무엇입니까? – andre

+0

파일은 예상 한 위치에 없습니다. 위치를 확인하거나'std :: ifstream fin ("file.txt")'를 사용하여 먼저 생성하십시오. – andre

답변

3

이 표준은 시스템 기능가 확장 된 오류를 넣어 것으로 예상된다있는 (로컬 스레드 ) int를 참조 뭔가로 확장 처리기 기호 errno,이 있음을 지정합니다 암호. 또한 strerror, 을 정의하여 문자 메시지 (errno과 달리이 메시지는 은 스레드로부터 안전함을 보장하지 않음)과 함께 문자 메시지 char const*을 복구 할 수 있습니다.

이 표준은 적어도 open의 경우, 하지 장소를 filebuf 에 사용 errno의 모든 요구 사항을 수행하지만 실제로 filebuf는 (희망) errno를 사용하는 낮은 수준의 기능을 호출합니다. (이것은 모든 시스템 호출 오류의 경우 errno을 설정하여 Posix, 요구하는 나는 윈도우에 대한 덜 확신한다..) 양방향 액세스로

: 아마 나쁜 생각하지만. .. filebuf은 항상 잠재적으로 양방향이지만, ifstream<< 연산자를 정의하지 않으며, ofstream 어떤 >> 연산자를 정의하지 않습니다, 그래서 당신은 std::fstream을 사용할 수 있습니다. 을 검색하려면이 파일을 바이너리 모드로 열려고합니다. 그렇지 않으면 전에도 에 머문 곳을 찾을 수 있으며 위치를 암기합니다. 의 내용을 읽으려면 더 좋은 해결책은 출력을 닫은 다음 열어서 읽는 것입니다.

0

답변 Q # 1 : errnoGetLastError() 마지막 오류 정보가 있습니다. 오류에 대한 문자열 메시지를 얻으려면 strerrno(errno)을 사용하십시오.

답변 Q # 2 : 읽기/쓰기 용으로 열려면 fstream (ostream 또는 istream이 아님) 클래스를 사용하고 열기 모드를 std::ios::in | std::ios::out으로 설정해야합니다.

+1

# 2의 경우 +1, # 1의 경우 -1 : C++ (errno의 경우), C++ 스트림을 사용 중입니다. Windows 만 (GetLastError의 경우)은 아닙니다. –

+0

네, 당신 말이 맞습니다. 가끔씩 모든 사람이 Windows를 사용하는 것을 잊지 않고 있습니다. –

+0

-1 Windows에서도 'GetLastError'를 사용할 수 없습니다. 실패한 API 호출 이후 다른 API 호출이 무엇인지 알 수 없습니다. 그런 오류 모델을 혼합해서 사용할 수는 없습니다. 'CreateFile '에 대한 호출이 실패하면'GetLastError'를 사용할 수 있습니다. 나는 또한 여기서 'errno'가 의미있는 것인지 아닌지에 대해 의심 스럽다. 제가 말할 수있는 바에 따르면'ifstream'은 실패시'errno '상태에 대한 약속을하지 않습니다. 또는 나는 무엇인가 놓치고 있냐? –

관련 문제