在C ++中删除文本文件中的空行

时间:2017-01-18 10:39:46

标签: c++ string windows

我有一个文本文件,可能包含一些空行。我想打开这个文件并查找空行。如果存在空行,那么我想删除该行。 我不想为此目的创建临时文件。我想编辑同一个文件,然后关闭它。

我已经看过几篇关于类似问题的帖子,但没有一个对我有效。

void DeleteEmptyLines(const string& FilePath)
{
    //EXISTING File
    std::fstream FileStream;
    std::string CurrentReadLine;
    if (doesFileExist(FilePath))
    {
        FileStream.open(FilePath, std::fstream::in | std::fstream::out | std::fstream::app);

        //Read all the lines till the end of the file
        while(getline(FileStream, CurrentReadLine))
        {
            //Check if the line is empty
            if(CurrentReadLine.empty())
            {
                cout<<"Empty line found"<<endl;
                //DELETE THIS EMPTY LINE
            }
        }

        FileStream.clear();
        FileStream.close();
    }
    // else --->> do nothing
}

当前文件(MyFile.txt):

Line1

Line2

Line3

我需要什么(MyFile.txt):

Line1
Line2
Line3

PS:我在Windows机器上使用VS2010。

3 个答案:

答案 0 :(得分:2)

简单的解决方案。将文件读入string空白行,然后使用string的内容覆盖该文件。

void DeleteEmptyLines(const std::string &FilePath)
{
    std::ifstream in(FilePath);
    std::string line, text;
    while (std::getline(in, line))
        if !(line.empty() || line.find_first_not_of(' ') == std::string::npos)
            text += line + "\n"
    in.close();
    std::ofstream out(FilePath);
    out << text;
}

编辑: @skm正如您所说,您发布的新答案不会删除空格行。

要解决此问题,请使用此条件以确保某行不是“空”:

!(CurrentReadLine.empty() || CurrentReadLine.find_first_not_of(' ') == std::string::npos)

答案 1 :(得分:0)

您无法在所有当前使用的文件系统中执行此操作,因为数据是连续存储的。所以从文件中“删除”一些字节,你必须以该字节数移动所有后续字节。并且你无法打开文件进行阅读,并在那一刻从头开始重写。

所以你有3个选择:

  1. 将所有文件读入内存,然后将行重写为原始文件 文件跳过空行。

  2. 逐行读取文件,仅保存 非空行进入内存,然后再写入同一文件。

  3. 使用临时文件,这实际上是一个很好的选择,因为你 不必拥有大量的RAM和文件移动操作 大多数文件系统都是低成本的(如果源和目的地都在 同一分区)。

答案 2 :(得分:0)

我修改了我的功能如下。

void DeleteEmptyLines(const string& FilePath)
{
    std::string BufferString = "";

    //File
    std::fstream FileStream;
    std::string CurrentReadLine;
    if (doesFileExist(FilePath))
    {
        FileStream.open(FilePath, std::fstream::in); //open the file in Input mode

        //Read all the lines till the end of the file
        while(getline(FileStream, CurrentReadLine))
        {   
            //Check if the line is empty
            if(!CurrentReadLine.empty())
                BufferString = BufferString + CurrentReadLine + "\n";   
        }
        if(DEBUG) cout<<BufferString<<endl;
        FileStream.close();

        FileStream.open(FilePath, std::fstream::out); //open file in Output mode. This line will delete all data inside the file.
        FileStream << BufferString;
        FileStream.close();
    }
    // else --->> do nothing
}

此功能执行以下步骤:

  1. 以输入模式打开文件
  2. 阅读所有非空的行
  3. 关闭文件
  4. 在输出模式下再次打开文件(删除文件中的所有数据)
  5. 将字符串放入文件
  6. 关闭文件。