C++ 从C+中的txt文件中删除特定行+;Can';我没有发现问题
你好,我试图完成我的程序,我需要它删除一行从文本文件。我尝试了其他人的多个代码,试图找出为什么我的temp.txt文件不会重命名和替换我的fruit.txt文件,而fruit.txt文件正是我从中删除一行的文件。任何帮助都将不胜感激 主要C++ 从C+中的txt文件中删除特定行+;Can';我没有发现问题,c++,file-rename,remove,C++,File Rename,Remove,你好,我试图完成我的程序,我需要它删除一行从文本文件。我尝试了其他人的多个代码,试图找出为什么我的temp.txt文件不会重命名和替换我的fruit.txt文件,而fruit.txt文件正是我从中删除一行的文件。任何帮助都将不胜感激 主要 #包括 #包括“filehandling.h” 使用名称空间std; int main() { 程序运行; run.askUser(); 返回0; } 文件处理.h #ifndef FILEHANDLING_H_INCLUDED #define FILEHA
#包括
#包括“filehandling.h”
使用名称空间std;
int main()
{
程序运行;
run.askUser();
返回0;
}
文件处理.h
#ifndef FILEHANDLING_H_INCLUDED
#define FILEHANDLING_H_INCLUDED
#include <fstream>
#include <iostream>
#include <string>
#include <cstdio>
#include <vector>
using namespace std;
class program{
public:
string name;
string desc;
ofstream out_stream;
ifstream in_stream;
void displayMenu () // Display for Menu
{
cout << "--------------------Welcome To Lemon Mart---------------------" << endl;
cout << "\t1: Add a Fruit to your cart." << endl;
cout << "\t2: Delete a item from your cart." << endl;
cout << "\t3: List of items in your shopping cart." << endl;
cout << "\t4: Checkout(Ends Program)." << endl;
}
void createFile() // Creates the file
{
out_stream.open ("fruit.txt");
if(!out_stream.is_open())
{
cout << "Output file failed." << endl;
exit(1);
}
}
void writeToFile(string fruitName) // Writes Input to the file
{
out_stream << fruitName << endl;
}
void listFruits() // fills array from file
{
in_stream.open("fruit.txt");
vector<string> fruitVec;
string str;
while (getline(in_stream, str))
{
if(str.size() > 0)
fruitVec.push_back(str);
}
cout << "Here's a list of what items you have in your cart currently" << endl << endl;
for (string & line : fruitVec)
cout << line << endl;
cout << endl << endl;
in_stream.close();
}
void delItem(string path,string eraseFruit)
{
string line;
ifstream fin;
fin.open(path);
ofstream temp;
temp.open("temp.txt");
while (getline(fin, line))
{
if (line != eraseFruit)
temp << line << endl;
}
temp.close();
fin.close();
const char * p = path.c_str();
remove(p);
rename("temp.txt", p);
}
void askUser()
{
int choice = 0;
string path = "fruit.txt";
string eraseFruit;
createFile();
while(choice <= 3)
{
displayMenu();
cin >> choice;
cout << endl;
switch (choice)
{
case 1 :
// ADD FRUIT TO BASCKET
cout << "Whats the name of the fruit you wish to add to your cart?" << endl;
cin >> name;
cout << "Item added to cart." << endl << endl;
writeToFile(name);
choice = 0;
break;
case 2 :
// Delete item from cart
cout << "What item would you like to delete from your cart?" << endl;
cin >> eraseFruit;
delItem(path, eraseFruit);
choice = 0;
break;
case 3 :
// List Cart items
listFruits();
choice = 0;
break;
case 4 :
// Exits Program
cout << "\tChecking Out, Have a good day!" << endl;
exit(1);
break;
default :
cout << "Must select a option" << endl;
choice = 0;
break;
}
}
out_stream.close();
}
};
#endif // FILEHANDLING_H_INCLUDED
#如果包含文件处理#
#定义包含的文件处理
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
班级计划{
公众:
字符串名;
字符串描述;
流出的水;
ifstream in_stream;
void displayMenu()//为菜单显示
{
cout一般来说,您不能“删除一行”,而是在没有不再需要的数据的情况下重写文件
如果不再需要的数据恰好是一行文本,则生成的文件将显示该行已删除。请尝试:
line.replace(line.find(eraseFruit), eraseFruit.length(), "");
你也可以试试擦除。虽然我不确定这一个是否有用
问题是您有out_stream.open(“fruit.txt”)
,但在程序结束之前您不会关闭它,因此无法删除()
打开的文件。您应该始终测试文件操作的返回值,例如。OP就是这样做的,不是吗?这就是代码试图做的。将整个程序放在头文件中的想法是什么?与其编写一个相当长的程序,不如编写一个非常小的程序,只尝试执行当前程序所执行的操作失败。如果这也失败了,把那个程序放在你的问题中,而不是你现在的问题中。做一个。Ted整个程序都放在头文件中的想法是,由于老师的要求,我的main代码尽可能少。我明白了。好吧,你并没有通过把它放在头文件中来真正改变任何事情-但是根据也许你的老师会笑一笑,下一次的要求会更清楚一些。:-)你可以试着不让流对象成为类成员。大多数时候,当你看到使用这些类型(fstream
s)时,它们从来没有显式关闭。你使用它们一段时间,让它们离开范围(然后它们将自动关闭)。现在,如果您的函数也这样做了:在函数中以所需模式打开文件-当函数返回时,文件将关闭。可能需要重新设计。这是我在浏览代码时发现的最可能的原因,不过,它要求OP使用其中一个OS:es,其中删除/重命名open失败错误(我突然想到Windows)。是的,我和你对Linux的看法是正确的——我没有意识到这一点。一般来说(可能是标准的)POSIX系统甚至允许您取消链接打开的文件,这非常有用,因为您可以执行以下操作:1.填充临时文件。2.删除目标文件。3.将临时文件重命名为目标文件1.填充临时文件,2.重命名…这意味着每当有人试图打开目标文件时,目标文件都会在那里。没有时间间隔突然消失。你可以打开文件的旧版本或新版本。另一个好处是:你可以创建一个文件,在保持打开状态的同时取消链接。你现在有一个临时文件要处理,它将在关闭时被删除……而且它甚至不会被其他进程看到,时间超过打开/创建/删除它所需的时间。好吧,我很可能相信在做了更多的测试之后,这也是问题所在。这背后的原因是,当我执行测试返回值时,它表示该文件没有权限,这意味着该文件仍然处于打开状态。但我不明白的是,我以为我在fin.close()中关闭了该文件。
line.replace(line.find(eraseFruit), eraseFruit.length(), "");