2013-02-11 17 views
0

我正在使用ifstream和getline逐行讀取輸入文件(比如在string line中)。我必須通過刪除它的第一個字符輸出string line到一個文件。我在做什麼是erase行的第一個字符並使用ofstream輸出它。有沒有更好的方法來做到這一點(意味着相對較快的方法)?我有數以百萬計的字符串。 (請注意,對於所有行,這僅適用於每10行的第一行)。C++:通過刪除第一個字符來將文件寫入文件

+1

你需要更好地闡述這個問題... – 2013-02-11 08:12:33

+0

@SolorzanoJose,有沒有任何方法來輸出字符串從第1個char到C++中的第10個字符? – user1838343 2013-02-11 08:13:35

回答

1

您可以輸出的實際字符串指針加一個:

outputStream << (line.c_str() + 1); 

不過,你最好檢查字符串不是空的第一個,或者你可能最終訪問非法指針。

如果你想輸出一個子串,那麼就是std::string::substr函數。或者使用std::ostream::write功能與指針運算上述組合:

outputStream.write(line.c_str() + 1, 9); /* 1st to 10th character */ 

針對上述情況,你必須確保該字符串的長度至少爲10個字符。

注意:我個人不會在這個答案中使用「黑客」,除非在極端情況下。子字符串函數是有原因的,是我推薦使用的。

+0

是** line.c_str()+ 1 **會比**擦除**更快嗎? – user1838343 2013-02-11 08:15:44

+1

@ user1838343是的,因爲你沒有擦除任何東西,你只需從第二個字符開始輸出而不是修改字符串。 – 2013-02-11 08:18:14

+0

@ user1838343然而,你應該做一些測量和分析,看看這是否真的是一個瓶頸。 – 2013-02-11 08:18:46

0

我假設你正在使用的std :: string ...

std::string str; // contains the line 
str.substr (1, str.length() - 1); // gives you what you need 

最佳,阿科什

+0

這可能效率不高,除非實現是寫時複製。此外,您可以省略第二個參數,因爲默認情況下函數會將字符串從第一個參數複製到結尾。 – 2013-02-11 08:48:05

0

也許最快的方式來寫整個字符串沒有第1字符爲@JoachimPileborg答案。 但是如果你想從1日到10日寫10個字符,那麼最快的方法是使用fwrite函數而不是fstream

fwrite(line.c_str() + 1, 1, 10, file); 

請注意,您應該使用它非常準確。你應該放心,該線有超過10個字符。

2

我想先試試最簡單的方法,看看它的速度不夠快:

if (!mystring.empty()) 
    std::copy(mystring.begin() + 1, mystring.end(), 
     std::ostreambuf_iterator<char>(stream_object)); 

你需要<algorithm><iterator>頭。