【问题标题】:deleting line in linux text file with C++使用 C++ 删除 linux 文本文件中的行
【发布时间】:2015-01-21 07:50:22
【问题描述】:

我需要有关如何编写代码以在 linux 中使用 c++ 执行删除行的帮助。下面列出了我在文本文件中的内容

描述:金额:日期
电费:100:25jan2015
电话费:100:25jan2015
电话费:50:25jan2015

我想这样做,以便当用户选择选项 b 以删除用户输入的费用并防止程序删除重复数据时,用户必须输入金额和日期。谢谢。

而 temp.txt 用于存储在重命名为 Expense.txt 之前未删除的内容,因此如果电话帐单值 100 被删除,它将变为

电费:100:25jan2015
电话费:50:25jan2015

void deleteexpensesdata(string& expense, string& texpense, double& amount,  string& date){
int check, x=0;
ifstream Expenses("Expense.txt");
ofstream temp("temp.txt");
cout << "\n";
cout << "Enter Type of Expense you wish to remove" << endl;
cin >> texpense;

while(Expenses >> expense >> amount >> date){
    if(texpense!=expense){//if there are expenses with different name, input their data into temp file
        temp << expense << ":" << amount << ":" << date <<endl;
    }
    if(texpense==expense){// if user entered correct name, x=1 for later output message that the user data has been deleted
       x=1; 
    }
}

Expenses.clear();
Expenses.seekg(0, ios::beg);
Expenses.close();
temp.close();
remove("Expense.txt");
rename("temp.txt","Expense.txt");
if(x==0){//x was set to 0 at start, so if it didn't change, it means there is error
    cout << "Remove of Expense failed" << endl;
}
else{//if x is not = 0 then remove is successful
    cout << "Expenses has been removed" << endl;
}
 }

调用函数的代码如下

        cout << "Remove Expense.\n";
        deleteexpensesdata(expense, texpense, amount, date);
        cout << "Expense Date has been delete. \n" << endl;
        cin.ignore();
        cin.get();

【问题讨论】:

  • 你忘了说你当前的代码在做什么 - 即你在temp.txt得到什么输出。

标签: c++


【解决方案1】:

下面的代码获取用户输入并将双精度转换为字符串,并将所有 3 个变量转换为与分隔符“:”一致,如您的示例输入所示,在您打开文件后,您会得到不匹配的行一个临时文件并重命名该文件,基本上将其删除。

double expamt;
    string line, expdesc, exptrans;
    cout << "Please Enter Expense: \n";
    cin >> expdesc;
    cout << "Please Enter Amount: \n";
    cin >> expamt;
    string newamt = static_cast<ostringstream*>( &(ostringstream() << expamt) )->str();
    cout << "Date of Transaction: (e.g 20jan2015)\n";
    cin >> exptrans;

    string input = expdesc + ":" + newamt + ":" + exptrans;

    ifstream myfile;
    ofstream tempfile;
    myfile.open("Expense.txt");
    tempfile.open("temp.txt");
while (getline(myfile, line))
{
    if (line != input)
        tempfile << line;
}
    cout << "\nExpense " << expdesc << " has been removed \n" <<endl;
    myfile.close();
    tempfile.close();
    remove("Expense.txt");
    rename("temp.txt", "Expense.txt");

【讨论】:

    【解决方案2】:

    首先一个建议:你应该学会使用gdb

    您的代码有几个逻辑错误,例如以下行:

    Expenses >> expense >> amount >> date
    

    可能没有做您期望做的事情,因为运算符 &gt;&gt; 不处理(默认情况下)字符“:”作为分隔符或分隔符。

    另外,不要使用变量 (x) 来检查输入错误,ifstreamofstream 对象具有以下功能:ifstream::goodifstream::failifstream::bad

    但是,您可以使用x 来检查是否进行了任何更改,如果没有,则不需要文件操作:

    remove("Expense.txt");
    rename("temp.txt","Expense.txt");
    

    也就是说,你的评论会被阅读:

    x在开始时被设置为0,所以如果它没有改变,那就意味着有错误

    其实这是错误的,x == 0 也意味着条件texpense==expense 从未成立。

    推荐

    1. 您可以使用std::iftream::getline 并将分隔符更改为:
    2. 您可以将std::iftream::getline 与正则表达式和std::regex::search 结合使用。

    我认为第一个更容易(如果: 没有被空格包围),第二个更优雅,更不容易出错。由你决定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2011-09-17
      • 2017-11-05
      • 1970-01-01
      相关资源
      最近更新 更多