2017-08-05 24 views
-2

私はインベントリプログラムを作成しようとしています。 ios :: appのようにinventory.txtファイルのデータを上書きしないようにする必要がありますが、ios :: appデータを追加すると破損した/ゴミ箱に読み込まれてしまいます。C++ fasteファイルからの読み込みでゴミが出る

私は問題がこの行にまで及ぶと思います: outfile.open( "inventory.txt"、ios :: out | ios:app | ios :: binary);

下記の機能を貼り付けました。

ありがとうございます!

void add() { 

    Inventory Item; 
    int recnum; 
    ofstream outfile; 

    // opening file 
    outfile.open("inventory.txt", ios::out | ios:app | ios::binary); 

    if (outfile.fail()) 
     cout << "\nFile failed to open" << endl; 

    cout << "\nPlease enter the record ID to be added (will overwrite duplicates) : "; 
    cin >> recnum; 
    cout << "\n" << recnum << " has been set as the record ID for this item." << endl; 

    cout << "Please enter item description in 50 characters or less : "; 
    cin.ignore(); 
    cin.getline(Item.description, size); 

    // do-whiles below are for looping for input validation 
    do { 
     cout << "Please enter the number of items on hand : "; 
     cin >> Item.quantity; 
     if (Item.quantity < 0) 
      cout << "Please enter a valid number." << endl; 
    } while (Item.quantity < 0); 

    do { 
     cout << "Please enter the wholesale price for this item : "; 
     cin >> Item.wholesale; 
     if (Item.wholesale < 0.01) 
      cout << "Please enter a valid number." << endl; 
    } while (Item.wholesale < 0.01); 

    do { 
     cout << "Please enter the retail price for this item : "; 
     cin >> Item.retail; 
     if (Item.retail < 0.01) 
      cout << "Please enter a valid number." << endl; 
    } while (Item.retail < 0.01); 

    // couldn't figure out how to perform input validation for date 
    cout << "Please enter the date this item was added (format: mm/dd/yyyy) : "; 
    cin.ignore(); 
    cin.getline(Item.dateadded, datesize); 

    // finding position in file, writing to file, closing file 
    outfile.seekp(recnum*sizeof(Item), ios::beg); 
    outfile.write(reinterpret_cast<char *>(&Item), sizeof(Item)); 
    outfile.close(); 

} 
+0

あなたのofstreamの使用して....あなたのタイトルはあなたのコードが1に書き込み、「ファイルから読み込む」と言い –

+0

....はifstreamではありません!また、 'Item'の宣言は何ですか?PODではなく、今あなたが行っているようなファイルに書き込むことはできません。 – Borgleader

+0

ねえねえ、でも、私がデータを書いているときに起こっていると思う問題です。私はこの後に呼び出すdisplay()関数を持っていて、ios :: appを追加した後にガベージの表示を開始するだけです。 – Kubie

答えて

0

この問題を解決するためには、私が代わりにios::appフラグのios::ateを呼び出す必要がありました。私はofstreamデータ型ではなくfstreamデータ型を使用しなければなりませんでした。ここで

は、この問題がtroubleshootedことができる方法についての更なる詳細です:Opening a binary output file stream without truncation

関連する問題