2014-03-14 521 views
1

我試圖刪除當我從一個文件中的列表中刪除一個人時創建的空行,所以我的文件在打開時看起來好多了。這是代碼我必須刪除該行。從字符串中刪除空行C++

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 
+0

''\ N'不是一個空行。這只是線的結束。想想空白行有什麼樣的字符模式。 – chris

+0

我想知道這件事。我的意思是白線可以包含空間,但我的線不包含任何東西.. – Cris

+0

@Cris只要看看像「Hello \ nWorld」這樣的東西它會超過2行,但沒有空白行。另一方面,如果你有「你好\ n \ nWorld」你有一個空白行。希望能幫助你理解你的問題。 –

回答

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

+0

我嘗試使用您的代碼以及我的編譯器,但似乎嘗試使用代碼時出現錯誤。 – Cris

+0

@Cris什麼錯誤?而什麼編譯器? –

+0

警告:lambda表達式僅適用於-std = C++ 0x或-std = gnu ++ 0x [默認啓用] 錯誤:沒有匹配函數調用'unique(std :: basic_string :: iterator, std :: basic_string :: iterator,CountLines():: )' – Cris

0

要刪除空行,你需要確保你是把他們全部納入\n去除冗餘\r,同時確保你不小心加線({'\r', '\n'}),那麼它的刪除重複的一個簡單的任務。

+0

'\ r'與他的問題有什麼關係?我在那裏看不到任何關於他們的事情。如果您將不同的操作系統代表換行符稱爲「\ r \ n」,「\ n」或「r」,請記住,當您將它們讀爲輸入時,它們全部變成了\ n。 –

+0

多麼迷人。 C++還沒有停止讓我驚歎。 – motoku

0

尋找回車發生兩次,並刪除一個。

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

運行它here

-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(); 
} 
//--- 
+0

這隻能刪除第一個空白行..我不知道如何刪除所有的空白行稍微改變代碼.... –