0

我正在尝试使用以下代码初始化一个包含 100 条空记录的文件:

void initializeInventory() {
    std::ofstream out("hardware.dat", std::ios::binary);

    Hardware h;
    for (int i = 0; i < 100; ++i) {
        h.ID = i;
        h.name = "try"; // std::string();
        h.quantity = 0;
        h.price = 0;
        h.notes = "try2"; //std::string();

        out.write(reinterpret_cast<const char*>(&h), sizeof(Hardware));
    }

    out.close();
}

但是当我尝试将它们打印出来时,它总是只打印 25 个元素或崩溃。
这是打印元素的功能:

void readInventory() {
    std::ifstream in("hardware.dat", std::ios::in);
    std::cout << std::setiosflags(std::ios::left) << std::setw(4) << "ID"
              << std::setw(16) << "Name"
              << std::setw(11) << "Quantity"
              << std::setw(10) << std::resetiosflags(std::ios::left)
              << "Price"
              << std::setw(50) << "Notes" << '\n';

    Hardware h;

    while (!in.eof()) {
        in.read(reinterpret_cast<char*>(&h), sizeof(Hardware));

        //if (!in.eof())
            printOut(std::cout, h);
    }

    in.close();
}

void printOut(std::ostream &output, const Hardware& h) {
    output << std::setiosflags(std::ios::left) << std::setw(4) << h.ID
           << std::setw(16) << h.name
           << std::setw(11) << h.quantity
           << std::setw(10) << std::setprecision(2)
           << std::resetiosflags(std::ios::left)
           << std::setiosflags(std::ios::fixed | std::ios::showpoint )
           << h.price
           << std::setw(50) << h.notes << '\n';
}

我还注意到,如果我增加 for 中的周期数(我尝试使用 400 而不是 100)文件hardware.dat似乎会增长,所以我认为这应该是打印功能中的问题。任何想法?有什么我想念的吗?
提前致谢。

4

1 回答 1

0

最好重载运算符 <<

friend ostream& operator<<(ostream& out, const Hardware& h) // output
{
    out << "(" << h.id() << ", " << h.whatever() << ")";
    return out;
}

并将文件逐行读取到硬件对象。顺便说一下,重载输入运算符 >> 也是可能的。

于 2013-06-04T15:44:25.630 回答