我接到的任务是:编写一个简单的程序,可用于删除文件中指定的一行一行的数据,步骤如下:手动创建包含以下内容的文件:
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
有人能帮助我吗?或者有更简单的方法来构建我的程序?谢谢
1条答案
按热度按时间rfbsl7qr1#
这段代码有两种不同的漏洞
第一个bug是
eof
的错误使用。第二个bug是全局变量output
的使用。代码假设变量在函数输入时是空字符串,但因为它是全局变量,所以没有办法确保这一点。这里是一个修正的版本,全局变量现在是一个局部变量,并且eof
问题已经修正。不要不必要地使用全局变量,它们是一个巨大的bug来源,也是许多其他问题的来源。在你的代码中还有其他几个。它们都应该被删除。