0

我正在尝试打开一个通常包含内容的文件,出于测试的目的,我想在文件不可用/不存在的情况下初始化程序,因此程序应该创建空文件,但在实现它时遇到问题。这是我最初的代码

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了所有的变体。谁能解释我该怎么做才能解决问题。谢谢!

4

4 回答 4

4

您已经发布了用于读取文件的代码,而不是创建空文件 - 在这方面您不需要扩展您的问题。而且您发布的内容不是阅读的好代码。eof() 函数在读取之后检测文件结尾,而不是在读取之前 - 基本上,您几乎不应该使用它。相反,您应该测试每次读取是否成功:

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

另外,如果你想创建一个输入流,为什么不使用 ifstream 对象明确地这样做:

ifstream city( "city.txt" );

无需弄乱 ios 标志。您应该真正测试 open 是否也有效:

if ( ! city.is_open() ) {
   throw "open failed" ;   // or whatever
}
于 2010-04-22T08:33:12.387 回答
2

首先,如果您不确定文件确实存在 - 设置citylat并设置lon为一些正常的默认值。

其次,您可以直接使用以下is_open成员fstream

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
}

如果由于某种原因从文件读取失败,您仍然将所有变量设置为默认值。

于 2010-04-22T08:43:45.710 回答
1

使用 ifstream.fail() 检查文件是否正确打开。如果出现问题(文件不存在或您无权读取或其他我不知道的情况),它会返回 true。因此,当失败时,您可以使用 ofstream.open() 创建一个。

于 2010-04-22T08:35:30.463 回答
1

ios::app如果您想(非破坏性地)在没有文件的情况下创建一个文件,您可以在附加模式(

于 2010-04-22T08:40:21.810 回答