2017-03-18 8 views
0

그래서 파일에 내용을 입력하고 싶지만 작동하지 않습니다. 내 코드는 다음과 같습니다.std :: ofstream 파일 추가

ofstream f("reservedTables.DAT"); 
    cin >> table; 
    f.open("reservedTables.DAT", ios::out | ios::app); 
    f << table; 
    f.close(); 

내가 뭘 잘못하고 있니? 변수 table의 번호를 쓰지만 넣은 파일에는 나타나지 않습니다.

답변

0

파일을 두 번 열었 기 때문입니다.

open으로 전화하는 경우 실제로는 rdbuf()->open(filename, mode | ios_base::out)입니다. 참고 (ref) :

관련 파일이 이미 열려있는 경우, 즉시 널 포인터를 반환한다.

null 포인터가 반환 되었기 때문에 내부 파일 버퍼에 할당되고 더 이상 파일이 열리지 않습니다. 즉, 쓰기 시도는 실패합니다.

std::ofstream f("reservedTables.DAT"); 
std::cin >> table; 
f << table; 
f.close(); 
+0

@ rRakete1111 그런 다음 열어 보지 않으면 글을 쓸 때 어떻게 추가합니까? 죄송합니다 나는 fstream을 많이 사용했고, 내가 아는 추가 메틀은 파일을 열 때입니다. – Roland

+0

@Roland [constructor] (http://en.cppreference.com/w/cpp/io)를 보면/basic_ofstream/basic_ofstream) 두 번째 인수로 기본 모드를 허용한다는 것을 알 수 있습니다. – Rakete1111

0

빠른 도보를 통해 :

이 생성자는 이미 파일 이름을 지정, 그래서 당신은 open를 호출 할 필요가없는 경우 파일을 열고

ofstream f("reservedTables.DAT"); 

를 할당 스트림과 파일을 엽니 다 .

cin >> table; 

사용자가 입력 한 내용을 읽습니다.

f.open("reservedTables.DAT", ios::out | ios::app); 

파일을 다시 열려고 시도합니다. 실패 할 것이다.

f << table; 

스트림은 페일 오픈 후에 실패 상태에 있으며 쓸 수 없습니다.

f.close(); 

파일을 닫습니다.

해결책

파일을 한 번 열고 오류를 확인하십시오.

ofstream f("reservedTables.DAT", ios::app); // no need for ios::out. 
              // Implied by o in ofstream 
cin >> table; 
if (f.is_open()) // make sure file opened before writing 
{ 
    if (!f << table) // make sure file wrote 
    { 
     std::cerr << "Oh snap. Failed write". 
    } 
    f.close(); // may not be needed. f will automatically close when it 
       // goes out of scope 
} 
else 
{ 
    std::cerr << "Oh snap. Failed open". 
} 
+0

답변 해 주셔서 감사합니다. – Roland

+0

사이드 노트 :'std :: ofstream'을 만들 때'ios :: out'은 필요하지 않습니다. 이미 출력 스트림이고'ios :: out' 자체를 추가 할 것이기 때문입니다. – Rakete1111

+0

Ja. 잘못된'ios :: out |을 제거했습니다. 서쪽에서 가장 빠른 총을하는 것보다 더 잘 알아야합니다. – user4581301