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フラグをいじる必要はありません。オープンも機能するかどうかを実際にテストする必要があります。

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

まず、ファイル存在するかどうかわからない場合は、 を設定しcity、いくつかの適切なデフォルトに設定します。latlon

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 を返します (ファイルが存在しないか、読み取り権限がないか、stg を認識していない場合)。したがって、失敗した場合は、ofstream.open() を使用して作成できます。

于 2010-04-22T08:35:30.463 に答える
1

ファイルが存在しない場合に (非破壊的に) ファイルを作成したい場合は、ファイルを追加モード ( ios::app) で開くことができます。これにより、存在しない場合は作成され、存在する場合はそのままになります。

于 2010-04-22T08:40:21.810 に答える