【问题标题】:C++ File I/O problemC++文件I/O问题
【发布时间】:2010-04-22 08:19:53
【问题描述】:

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

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

【问题讨论】:

  • 你确定txt文件中的元素个数相等吗?您只检查 city 的 EOF。
  • 它们通常是,但是这是一个好点,我也会在我的测试中实现它,谢谢 zoli

标签: c++ file-io fstream ifstream ofstream


【解决方案1】:

您已经发布了用于读取文件的代码,而不是创建空文件 - 您无需在这方面扩展您的问题。而且您发布的内容不是阅读的好代码。 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
}

【讨论】:

    【解决方案2】:

    首先,如果您不确定文件确实存在 - 将citylatlon 设置为一些合理的默认值。

    第二,可以直接使用is_openfstream的成员:

    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
    }
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        如果你想(非破坏性地)创建一个文件(如果没有),你可以在附加模式(ios::app)中打开它,如果它不存在,它将创建它,并且保持不变如果是的话。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-20
          • 1970-01-01
          • 2017-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多