我正在尝试打开一个通常有内容的文件,为了测试的目的,我想在没有文件可用/现有的情况下初始化程序,因此程序应该创建空的,但是在实现它时遇到问题。这是我原来的代码
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 :(得分: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
}
答案 1 :(得分:2)
首先,如果您不确定文件执行是否存在,请将city
,lat
和lon
设置为某些合理的默认值。
其次,您可以直接使用is_open
的{{1}}成员:
fstream
如果由于某种原因从文件读取失败,您仍然将所有变量设置为默认值。
答案 2 :(得分:1)
使用ifstream.fail()检查文件是否正确打开。如果出现问题,它返回true(文件不存在或者您没有读取权限或者我不知道的其他内容)。因此,当失败时,您可以使用ofstream.open()创建一个。
答案 3 :(得分:1)
如果你想(非破坏性地)创建一个文件(如果没有),你可以在附加模式(ios::app
)中打开它,如果它不存在则会创建它,并离开如果它没有触及它。