2013-06-04 46 views
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'; 
} 

我還指出,如果我增加在用於循環的數目(我試圖把100 400代替)的文件hardware.dat似乎成長,所以我認爲這應該是打印功能中的問題。任何想法?有什麼我失蹤?
在此先感謝。

回答

0

這將是最好的超負荷運營商< <

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

和逐行讀取文件中的行到硬件對象。 順便說一句,重載輸入操作符>>也是可能的。