我的数据在使用函数?操作文件C++时显示了两次-案例:在C++中删除特定行

plupiseo  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(108)

我接到的任务是:编写一个简单的程序,可用于删除文件中指定的一行一行的数据,步骤如下:手动创建包含以下内容的文件:

i.  Fill from line 1
ii. Fill from line 2
ii. Fill from line 3
iv. Fill in line 4

显示文件的全部内容。
我已经创建了如下程序:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
// Function Prototipe
void garis();
void show_databefore();
void show_data();
void del_line(const char *file_name, int n);
// Variable Declaration
int n;
ifstream myFile;
string output,buffer;
// Main Function
int main(){
    cout << "Show data and delete specific line Program " << endl;
    garis ();
    cout << "The Data " << endl;
    show_databefore();
    garis();
    
    cout << "Select the Rows of data you want to delete: ";
    cin >> n;
    cout << "\nBefore " << endl;
    // If Case after input n
    if((0 < n) && (n < 100)){
        del_line("data1.txt", n);  // this process will delete the row that has been selected.
    } else {
        cout << "Error" << endl;} 
    show_data(); // when calling this function. Display on the console, data is displayed 2 times.
    return 0;
}

//Function to delete data in the row that has been selected
void del_line(const char *file_name, int n){    
  ifstream fin(file_name);    
  ofstream fout;                
  fout.open("temp.txt", ios::out); 
  
  char ch; 
  int line = 1;            
  while(fin.get(ch)) 
  {      
    if(ch == '\n') 
      line++; 
     
    if(line != n)      
      fout<<ch; 
  } 

  fout.close();  
  fin.close();   

  remove(file_name);        
  rename("temp.txt", file_name);  
} 

// Function to display data1.txt to the console
void show_databefore(){
    myFile.open("data1.txt");
    while (!myFile.eof()){
        getline(myFile,buffer);
        output.append("\n" + buffer); 
    }
    cout << output << endl;
    myFile.close(); 
}
// Function to display data1.txt to the console  T
// This fuction actually same as show_databefore. 
void show_data(){
    myFile.open("data1.txt");
    while (!myFile.eof()){
        getline(myFile,buffer);
        output.append("\n" + buffer); 
    }
    cout << output;
    myFile.close(); 
}
//Function to provide a boundary line.
void garis(){
    cout << "======================================================= " << endl << endl;
}

当我运行我的程序时,它工作,但是当我把数据带到控制台时,我的数据出现了2次,我试过不使用函数的方法,但是结果仍然是一样的。
Here is the result
有人能帮助我吗?或者有更简单的方法来构建我的程序?谢谢

rfbsl7qr

rfbsl7qr1#

这段代码有两种不同的漏洞

void show_data(){
    myFile.open("data1.txt");
    while (!myFile.eof()){
        getline(myFile,buffer);
        output.append("\n" + buffer); 
    }
    cout << output;
    myFile.close(); 
}

第一个bug是eof的错误使用。第二个bug是全局变量output的使用。代码假设变量在函数输入时是空字符串,但因为它是全局变量,所以没有办法确保这一点。这里是一个修正的版本,全局变量现在是一个局部变量,并且eof问题已经修正。

void show_data(){
    string output; // local variable
    myFile.open("data1.txt");
    while (getline(myFile,buffer)){
        output.append("\n" + buffer); 
    }
    cout << output;
    myFile.close(); 
}

不要不必要地使用全局变量,它们是一个巨大的bug来源,也是许多其他问题的来源。在你的代码中还有其他几个。它们都应该被删除。

相关问题