【问题标题】:Using Ifstream to add numbers from text file to a C Style Array使用 Ifstream 将文本文件中的数字添加到 C 样式数组
【发布时间】:2011-04-19 13:27:23
【问题描述】:

上面的标题有问题。我尝试了以下方法,但它的行为不正确。

void ArrayIntStorage::read(ifstream& in)
{
    if(in.is_open())
    {
        while(!in.eof())
        {
            in.getline(arrayStorage, sizeof(in));
        }
    }
}

ofstream& ArrayIntStorage::write(ofstream &out) const
{
    for (int i = 0; i < sizeof arrayStorage; i++)
    {
        out << arrayStorage[i] << endl;
    }
    return out;
}

我是 C++ 编程的新手,所以我可能在做一些愚蠢的事情。提前致谢。

【问题讨论】:

  • arrayStorage 是什么类型的?文件的格式是什么?
  • 您的预期行为是什么,您实际得到了什么?

标签: c++ arrays file text ifstream


【解决方案1】:

我猜你正在读/写一个整数数组。看来您可能错误地读取了 sizeof(in),而不是 read 方法中的 sizeof(arrayStorage)。

【讨论】:

    【解决方案2】:

    您的代码存在几个问题。首先,你 不要给我们看arrayStorage的声明,所以我们必须 猜猜看:我猜int arrayStorage[N],(N 是一些 持续的)。接下来,阅读:

    • 在循环中使用 `istream::eof` 永远都不正确。这 函数只有在输入失败时才有意义;前 也就是说,它可以在没有其他内容时返回“false” 读取,并且 `true`,即使最后一次输入成功。这 你感兴趣的函数是 `fail`,这就是 每当使用 `istream` 时间接调用 需要 `bool` 的上下文。
    • `getline` 需要 `char[]`,并且读取字符,而不是 整数。

    如果所有文件包含的都是这些 int,标准的成语 阅读它们将是:

    for (int i = 0; in && i < N; ++ i) {
        in >> arrayStorage[i];
    }
    

    在实践中,您可能会想要更多:如果 该文件不包含足够的int?如果它包含太多? 并且您需要在失败后验证失败 是由于文件结束,而不是文件中的一些随机乱码 文件。或者您可能想要(或需要)更多地验证格式, 确保一行中的 int 不超过一个。

    你的输出函数看起来几乎没问题;最后一个索引应该是N,而不是sizeof arrayStorage(它返回数组中的字节数,而不是元素数)。后来,顺流而下, 您需要检查 之后 是否没有错误 关闭文件;没有比这更令人沮丧的了 一个程序说它成功了,而实际上只是其中的一部分 数据已写入磁盘。

    【讨论】:

      猜你喜欢
      • 2011-05-21
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      相关资源
      最近更新 更多