【问题标题】:How to not overwrite the file, C++ logging如何不覆盖文件,C++ 日志记录
【发布时间】:2016-04-27 05:51:23
【问题描述】:

这是我的代码。每次我“保存”时,它都会覆盖旧的 txt 文件。如何将新行或图集输出到同一个文件中。这是一个动态数组,我正在使用 switch case。输入数据后,我想将其保存到文本文件中。并在下次重新加载。加载功能也很好用。

#include<iostream>
#include<string>
#include<fstream> //to save file in text
using namespace std;
int main ()
{
int *p1;
int size=0;
int counter=0;
p1 = new int[size];
int userchoice;
int i;
int position;
while(1)
{
    cout << "Please enter your choice " << endl;
    cout<<endl;
    cout << "To insert Press '1'" << endl;
    cout << "To Delete press '2'" << endl;
    cout << "To View press '3'" << endl;
    cout << "To Search press '4'" << endl;
    cout << "To Save Press '5'" << endl;
    cout << "To Load Previously saved Data press '6'" << endl;
    cout << "To Exit press '7'" << endl;
    cout << endl;
    cin>>userchoice;
switch(userchoice)
{
case 1:
        cout<<"Enter a Number -->";
        cin>>p1[size];
        counter++;
        size++;
        break;
case 2:
        int udelete;
        cout<<"Enter a number to delete --> ";
        cin>>udelete;
        for(position = 0; position<size; position++)
        {
            if (p1[position] == udelete)
                break;
        }
        if(position>size)
        {
            cout<<"The number is not in the memory ";
            cout<<endl;
                break;
        }
        for(i = position; i<size; i++){
            p1[i]=p1[i+1];
        }
        size--;
        cout<<"Successfully Deleted!!! ";
        cout<<endl;
        break;
case 3:
        for (i=0; i<size; i++)
                {
                    cout<<"Your data" <<" " << i << " " << "-->" <<p1[i]<<endl;
        }
        break;
case 4:
    {
        int usearch;
        cout<<"Please enter the figure you would like to search ";
        cout<<"->";
        cin>>usearch;
            for(i=0; i>size; i++)
            {
                if (p1[size]==usearch)
                    break;
            }
             if(usearch==size)
             {
                cout<<"not found";
             }
             cout<<"Position at: "<<i+1<<endl;
             break;
    }
case 5:
    {
            ofstream save;
        save.open("data.txt");
        for (i=0; i<size; i++)
        {
            save <<p1[i] <<endl;
        }
        save.close();
        cout<<"File Saved "<<endl;
            break;
        }
case 6:
    {
    string read;
    ifstream file_("data.txt");
    if (file_.is_open())
    {
        while(getline(file_,read))
        {
            cout << read << "\n";
        }
        file_.close();
    }
    else
    cout << "File Not open" << endl;
    cin.get();
    break;
    }
case 7:
    {
    return 0;
    }
}
    }}

【问题讨论】:

标签: c++ logging fstream


【解决方案1】:

您可能有两种情况: 1)在文件末尾追加数据 2) 在文件中间插入数据

案例一:在文件末尾追加数据: 要在末尾追加数据,您应该以“追加”模式打开文件。

i.e. std::ofstream LogFile("TempFile.txt", std::ios_base::app | std::ios_base::out);

案例二:在文件中间插入数据: 要在文件中间插入数据,不能使用“APPEND”模式。使用其他模式打开文件并使用seekp(offset,direction),它允许您提供偏移量和方向。例如

fstream LogFile("TempFile.txt", std::ios_base::binary | std::ios_base::out | std::ios_base::in);
    LogFile.seekp(10, ios::beg);
    LogFile.write("abc", 4);

【讨论】:

    【解决方案2】:

    以“追加”模式打开文件。

    save.open( "data.txt", ofstream::out | ofstream::app );
    

    如果文件不存在,这将创建文件,否则将写指针定位在文件末尾。

    您不必显式调用open。有一个构造函数会为你做这件事:

    ofstream save( "data.txt", ofstream::out | ofstream::app );
    

    您也不需要调用close,因为当save 被破坏时会自动调用。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2012-01-12
      • 1970-01-01
      • 2014-03-17
      • 2022-01-27
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多