2010-04-22 18 views
0

我想打開一個通常有內容的文件,爲了測試的目的,我想先初始化程序,而沒有文件可用/存在,那麼程序應該創建空的,但是我在執行它時遇到問題。這是我的代碼最初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(); 
} 

我已經試過所有我能想到的,ofstream的,ifstream的,加入ios::out所有所有的變化。任何人都可以向我解釋爲了解決這個問題該怎麼做。謝謝!

+0

你確定txt文件中的元素數量是否相等?您正在檢查只有EOF的「城市」。 – zoli2k 2010-04-22 08:23:11

+0

他們通常是,但是這是一個很好的觀點,我會執行它也在我的測試,感謝zoli – Carlos 2010-04-22 08:33:29

回答

4

您已經發布了讀取文件的代碼,而不是創建空的代碼 - 您需要在這方面擴展您的問題。而你發佈的內容並不是很好的閱讀代碼。 eof()函數在讀取之後檢測文件的結尾,而不是在一個之前 - 基本上,您幾乎從不使用它。相反,你應該測試每個讀取成功:

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

另外,如果你想創建一個輸入流,爲什麼不這樣做的明確使用ifstream的對象:

ifstream city("city.txt"); 

不需要弄亂與ios標誌在一起。你應該真的測試打開是否工作:

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

非常感謝尼爾!特別爲最佳做法提示 – Carlos 2010-04-22 08:57:30

1

使用ifstream.fail()來檢查文件是否正確打開。如果出現問題,它會返回true(文件不存在,或者您沒有讀取權限或者我不知道其他情況)。所以當失敗時,你可以用ofstream.open()創建一個。

1

如果你想(非破壞性)創建一個文件,如果沒有一個,你可以打開它的追加模式(ios::app),這將創建它,如果它不存在,並保持不變它確實如此。

2

首先,如果你不確定該文件存在 - 設置citylatlon一些理智的默認值。

其次,你可以使用的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 
} 

如果從文件中讀取失敗,由於某種原因,你還是所有變量設置爲默認值。