2010-04-22 4 views
0

일반적으로 콘텐츠가있는 파일을 열려고하는데 테스트 목적으로 파일을 사용할 수 없으면/기존 파일을 초기화하지 않으므로 프로그램에서 빈 파일을 만들어야하지만 그것을 구현하는 데 문제가 있습니다. 이 ios::out 모든 모든 변화를 추가, 원래 내 코드 내가 ofstream, ifstream, 생각할 수있는 모든 것을 시도C++ 파일 I/O 문제

void loadFiles() { 
fstream city; 
    city.open("city.txt", ios::in); 
fstream latitude; 
    latitude.open("lat.txt", ios::in); 
fstream longitude; 
    longitude.open("lon.txt", ios::in); 
while(!city.eof()){ 
    city >> cityName; 
    latitude >> lat; 
    longitude >> lon; 
    t.add(cityName, lat, lon); 
} 
city.close(); 
latitude.close(); 
longitude.close(); 
} 

입니다. 아무도 내 문제를 해결하기 위해 무엇을해야하는지 설명 할 수 없었습니다. 감사!

+0

txt 파일의 요소 수가 동일합니까? '도시'에 대해서만 EOF를 확인하고 있습니다. – zoli2k

+0

그들은 일반적으로 좋은 지적이지만, 테스트에도 구현할 것입니다. zoli – Carlos

답변

4

파일을 읽지 않고 빈 파일을 만들지 않은 코드를 게시했습니다.이 점에 관해서는 질문을 확장 할 필요가 없습니다. 그리고 당신이 게시 한 것은 좋은 읽을 거리가 아닙니다. eof() 함수는 읽기 전후의 파일 끝을 감지합니다. 기본적으로는 거의 사용하지 않아야합니다. 혼란에

ifstream city("city.txt"); 

필요가 없습니다 : 당신은 왜 ifstream 객체를 사용하여 이렇게 명시 적으로하지 입력 스트림을 만들려면,

while((city >> cityName) && (latitude >> lat) && (longitude >> lon) { 
    t.add(cityName, lat, lon); 
} 

또한 대신, 각 읽기의 성공을 테스트해야 주위에 ios 플래그가 있습니다.

if (! city.is_open()) { 
    throw "open failed" ; // or whatever 
} 
+0

Neil에게 감사드립니다! 특히 모범 사례 팁을 위해 – Carlos

1

ifstream.fail()을 사용하여 파일이 제대로 열렸는지 확인하십시오. 뭔가 잘못되면 (파일이 존재하지 않거나 읽지 못하거나 stg을 가지고 있지 않다면), true를 반환합니다. 그래서 실패했을 때 ofstream.open()으로 하나를 만들 수 있습니다.

1

파일이없는 경우 (비파괴 적으로) 파일을 만들려면 추가 모드 (ios::app)로 파일을 열어 파일이 존재하지 않으면 파일을 만들고 그 파일을 그대로 두십시오. 그렇습니다. 당신이 파일 이 존재 할 것이 확실하지 않으면

2

첫째, - 약간 제정신 기본값으로 city, latlon을 설정합니다.

둘째, fstream의 직접 is_open 멤버를 사용할 수 있습니다

파일에서 읽는 것은 여전히 ​​모든 변수가 기본값으로 설정 한 몇 가지 이유로 실패 할 경우
fstream f; 
f.open("f.txt", ios::in); 
if (f.is_open()) { 
    // attempt reading here 
} else { 
    f.open("f.txt", ios::out | ios::app); // create empty file 
} 

.