0

I'm trying to remove a single line from a file without creating a new file. For example in the file before it is modified it would be:

This
is
a
file

and after it would be:

This
a
file

However, with the way I'm currently trying to do it what happens is

This
  a
file

I know I could do it by writing only the contents that I want into another file and then renaming that file and deleting the old one but I wanted to know if there is another way besides that.

I've tried using

if (string::npos != line.find(SPSID))
{
        iPos = (pos - line.size() - 2);

    stream.seekg(iPos);
    for (int i = (pos - line.size() - 2); i < pos; i++)
    {
        //Sets input position to the beginning of the current line and replaces it with NULL
        stream.put(0);
    }
    stream.seekp(iPos);
    pos = stream.tellp();
}

as well as replacing stream.put(0); with stream.write(nullLine, iPos); but neither have worked.

int Delete(string fileName, string SPSID)
{
    //Variables
    string line;
    char input[MAX_CHAR];
    fstream stream;
    streamoff pos = 0;
    streamoff iPos = 0;

    //Opening and confirming opened
    stream.open(fileName);

    if (!stream.is_open())
    {
        cout << "File Did not open.\n" << endl;
        return -1;
    }

    //Loops until the end of the file
    do
    {
        //Gets one line from the file and converts it to c++ string
        stream.getline(input, MAX_CHAR, '\n');
        line.assign(input);

        //Finds the current output position (which is the start of the next line)
        pos = stream.tellp();

        //Finds and checks if the SPSID is in the string. If it is then print to screen otherwise do nothing
        if (string::npos != line.find(SPSID))
        {
            iPos = (pos - line.size() - 2);

            stream.seekg(iPos);
            for (int i = (pos - line.size() - 2); i < pos; i++)
            {
                //Sets input position to the begining of the current line and replaces it with ""
                stream.put(0);
            }
            stream.seekp(iPos);
            pos = stream.tellp();
        }

    } while (stream.eof() == false);    //Checks that the end of the file has not been reached

    stream << "Test" << endl;

    //Resets the input and output positions to the begining of the stream
    stream.seekg(0, stream.beg);
    stream.seekp(0, stream.beg);

    //Closing and Confirming closed
    stream.close();

    if (stream.is_open())
    {
        cout << "File did not close.\n" << endl;
        return -2;
    }


    return 0;
}

I'm probably gonna have to make a new file and rename it but figured it was still worth asking if this is possible. :/

7g3p
  • 23
  • 7
  • 3
    A file is basically an array. You can't remove the middle element of an array without shifting everything after it forward. You'd need to to the same thing to your file. – NathanOliver Sep 13 '19 at 17:32
  • Damn, I was afraid of that – 7g3p Sep 13 '19 at 17:36
  • After shifting everything in the file you may also have to convince the file to be shorter, something that's difficult to do without system-specific calls before C++17 and [the library](https://en.cppreference.com/w/cpp/filesystem/resize_file). You nailed it. Making the new file is many times easier. – user4581301 Sep 13 '19 at 17:42

0 Answers0