0

我正在使用 ifstream 和 getline(比如 in )逐行读取输入文件string line。我必须string line通过删除文件的第一个字符来输出到文件。我正在做的是eraseing 行的第一个字符并使用 ofstream 输出它。有没有更好的方法(意味着相对更快的方法)?我有数以百万计的字符串。(请注意,并非所有行都如此,仅适用于每 10 行的第一行)。

4

4 回答 4

2

我会先尝试最简单的方法,看看它是否足够快:

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

你需要<algorithm><iterator>标题。

于 2013-02-11T10:08:44.193 回答
1

您可以输出实际的字符串指针加一:

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

但是,您最好先检查字符串是否为空,否则您可能最终会访问非法指针。

如果你想输出一个子字符串,有这个std::string::substr函数。或者使用std::ostream::write与上述指针算法相结合的函数:

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

对于上述情况,您必须确保字符串的长度至少为十个字符。

注意:除非在极端情况下,否则我个人不会使用此答案中概述的“黑客”。子字符串函数的存在是有原因的,并且是我推荐使用的函数。

于 2013-02-11T08:13:23.117 回答
0

我假设您正在使用 std::string ...

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

最好的,阿科斯

于 2013-02-11T08:15:50.763 回答
0

也许在没有第一个字符的情况下编写整个字符串的最快方法是来自@JoachimPileborg 的回答。但是如果你想从第 1 到第 10 写 10 个字符,那么最快的方法是使用fwritefunction 而不是fstream.

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

请注意,您应该非常准确地使用它。您应该放心,该行有超过 10 个字符。

于 2013-02-11T08:21:36.500 回答