Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从C+中的txt文件中删除特定行+;Can';我没有发现问题_C++_File Rename_Remove - Fatal编程技术网

C++ 从C+中的txt文件中删除特定行+;Can';我没有发现问题

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

你好,我试图完成我的程序,我需要它删除一行从文本文件。我尝试了其他人的多个代码,试图找出为什么我的temp.txt文件不会重命名和替换我的fruit.txt文件,而fruit.txt文件正是我从中删除一行的文件。任何帮助都将不胜感激

主要

#包括
#包括“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(), "");