簡體   English   中英

寫入/讀取二進制/文本文件

[英]Writing/reading in to binary/text files

wFile.open(fileName, ios::out | ios::trunc);
if (!(wFile.is_open()))
{
    cout << "Error in opening the file" << endl;
    return false;
}
else
{
    for (unsigned int i = 0; i < Widgets.size(); i++)
    {
        Widgets.at(i)->copyToBinary(fileName);
    }
    wFile.close();
    return true;
}

我正在嘗試從矢量復制不同的對象類型。 我的問題是,當此代碼為副本運行時,它僅復制最后一個對象。 似乎代碼只是覆蓋了現有文本。

另外,我在每個類中都有此代碼(這是copyToBinary函數):

ofstream file(fName);
file << *this;
file << endl;

我在這里想念什么?

您不應該在copyToBinary重新打開文件。 wFile作為參數而不是filename傳遞:

...copyToBinary(ostream &file) {
  file << *this;
  file << endl;
}

並調用...copyToBinary(wFile)

問題:

您將優良copyToBinary()傳遞給copyToBinary() ,重新打開流並覆蓋它。

解:

傳遞wFile流作為參考並寫入它,而無需每次都重新打開

void copyToBinary(ostream& file) {
   file << *this;
   file << endl;
}

首先,當您打開文件時

wFile.open(fileName, ios::out | ios::trunc);

每當您使用trunc模式時,現有內容都會丟失。 如果使用ios::app模式會更好。 這樣,只要上述代碼運行,它就會以附加模式打開文件。

其次,您要在copyToBinary函數中傳遞文件名。 並且通過使用默認構造函數

ofstream file(fName);

您的文件每次都在默認ios::out模式下打開,但不在ios::app模式下打開。 最好是通過打開文件的引用,或者以附加模式打開文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM