2010-04-22 53 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 
} 

如果从文件中读取失败,由于某种原因,你还是所有变量设置为默认值。