我有一个文本文件,可能包含一些空行。我想打开这个文件并查找空行。如果存在空行,那么我想删除该行。 我不想为此目的创建临时文件。我想编辑同一个文件,然后关闭它。
我已经看过几篇关于类似问题的帖子,但没有一个对我有效。
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。
答案 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个选择:
将所有文件读入内存,然后将行重写为原始文件 文件跳过空行。
逐行读取文件,仅保存 非空行进入内存,然后再写入同一文件。
使用临时文件,这实际上是一个很好的选择,因为你 不必拥有大量的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
}
此功能执行以下步骤: