【问题标题】:c++: writing strings to file by removing first charc ++:通过删除第一个字符将字符串写入文件
【发布时间】:2013-02-11 08:10:50
【问题描述】:

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

【问题讨论】:

  • 你需要更好地阐述这个问题......
  • @SolorzanoJose,有没有什么方法可以在 C++ 中输出从第一个字符到第十个字符的字符串?

标签: c++


【解决方案1】:

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

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

您将需要 &lt;algorithm&gt;&lt;iterator&gt; 标头。

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

    • is line.c_str() + 1 会比 erase 快吗?
    • @user1838343 是的,因为你没有擦除任何东西,你只是从第二个字符开始输出而不是修改字符串。
    • @user1838343 但是,您可能应该进行一些测量和分析,看看这是否真的是一个瓶颈。
    • 如果行为空,这不会溢出吗?
    • 指针有效,不是问题。但是,它不是指向零终止字符串的指针(因为它指向零终止符后面)。这就是为什么它的后续使用可能会是UB。
    【解决方案3】:

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

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

    最好的,阿科斯

    【讨论】:

    • 这可能效率不高,除非实现是 Copy-On-Write。此外,您可以省略第二个参数,因为默认情况下该函数会将字符串从第一个参数复制到末尾。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-13
      • 2011-06-24
      • 1970-01-01
      • 2011-05-16
      • 2011-05-29
      • 2012-11-27
      • 1970-01-01
      相关资源
      最近更新 更多