从字符串c ++中删除空行

时间:2014-03-14 02:59:27

标签: c++ string

我正在尝试删除从文件列表中删除某人时创建的空行,这样我的文件在打开时看起来更好。这是Code我必须删除该行。

std::ifstream ifs("alpha.dat");



  std::ofstream tem("temporary.text");

std::string str((std::istreambuf_iterator<char>(ifs)),
std::istreambuf_iterator<char>());

str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());



cout << str;
tem << str;
tem.close();    
ifs.close();

我的文件内容如下:

maria hernandez 1000 h3777 +1000 19:15:19    
rachel dominguez 100000 X8793 +100000 19:15:20                                                  
carlos yatch 20 g6386 +20 19:15:20 

Empty line

carlos Domingues 20 g3336 +20 19:15:20                                                                                                                
Empty Line

但是我在文件上得到的是当前的内容:

maria hernandez 1000 h3777 +1000 19:15:19 rachel dominguez 100000 X8793 +100000 19:15:20 carlos yatch 20 g6386 +20 19:15:20 

4 个答案:

答案 0 :(得分:3)

您不应该删除所有\n。它们不代表空白行,而是换行符的开头。当你连续多次\n时,你得到一个空白。

要删除这些连续\n个字符,我建议替换:

str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());

有这样的事情:

str.erase(std::unique(str.begin(), str.end(),
                      [] (char a, char b) {return a == '\n' && b == '\n';}),
          str.end());

工作示例here

std::unique删除相等的连续元素。但是因为我们只想删除换行符,所以我们将lambda作为谓词传递。最后,我们只需要删除移动到容器末尾的重复\n

答案 1 :(得分:0)

要删除空白行,您需要确保删除多余的\r并将其全部变为\n,同时确保不会意外添加行({'\r', '\n'}) ,然后删除重复项是一项简单的任务。

答案 2 :(得分:0)

查找两次发生的回车,并删除一次。

size_t pos;
while ((pos= str.find("\n\n", 0)) != std::string::npos)
{
    str.erase(pos, 1);
}

运行here

答案 3 :(得分:-1)

/* Processing of text lines the method length()
 The search for the longest line of the text.
 Removing of the particular line of text.
The first step.
 Write a function to find the empty line of the text file:*/
//------------------------------------------------------------
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int Find();
void Remove( int k);
//------------------------------------------------------------
int main()
{
 cout << "blank line no "<<"is:   "<<Find()<<endl;
 Remove(Find());
 return 0;
}
//------------------------------------------------------------
int Find()
{
 int nr = 0; string ilg = "";
 int n = 0; string eil;
 ifstream fd("Data.txt");
 while (!fd.eof()) {
 getline(fd, eil);
 for(int i=0;i<n;i++)
 {  
 if (eil.length() == 0) {
     nr = n; ilg = eil;}
 }
 n++;

 }
  fd.close();
 return nr;
}
//---------------------
/*The second step. Write a function to remove the given line:*/
//------------------------------------------------------------
void Remove( int k)
{
 string eil;
 ofstream fr("Result.txt");
 ifstream fd("Data.txt");
 // The lines are copied till the removed
 for (int i = 0; i < k; i++) {
 getline(fd, eil);
 fr << eil << endl;
 }
 // The line, which has to be removed, is not copied
 getline(fd, eil);
 // The remaining lines are copied
 while (!fd.eof()) {
 getline(fd, eil);
 fr << eil << endl;
 }
 fd.close();
 fr.close();
}
//---