【问题标题】:How to split a read Text File into "\n"s?如何将读取的文本文件拆分为“\n”?
【发布时间】:2023-03-02 22:18:01
【问题描述】:

我需要将一个文本文件拆分成句子,通过移动到下一行来分隔。

想象一下这段文字:

Hey what's up
How are you doing?
Enjoy your coding!

这是我想出的从文件中获取文本并保存的方法:

ifstream file;
string text, finaltext;
file.open("input.txt", ios::in);

    while(getline(file, text)){
    finaltext += text;
}

cout<<finaltext;

所以这实际上完成了工作,但是由于一个奇怪的原因它跳过了“\n”,我得到的结果是这样的:

Hey what's upHow are you doing?Enjoy your coding!

所以我需要找到一种新的方法来做到这一点,确保 finaltext 获取由“\n”s 分隔的文本。有人可以帮帮我吗?我会永远感激不尽。谢谢各位。

【问题讨论】:

  • 您所要做的就是在while 循环的末尾添加finaltext += '\n'; 行。
  • "but for a weird reason it skips the "\n" " -- 原因并不奇怪。 std::getline 的文档明确指出它丢弃了换行符。所以,如果你想要它回来,你必须手动添加它。

标签: c++ string visual-studio file ifstream


【解决方案1】:

如果您要单独获取每一行,您可以尝试以下操作:

file.open("input.txt", ios::in);

while (getline(file, text)) {
    finaltext += text;
    finaltext += "\n";
}

这样,您自己添加换行符。

【讨论】:

    【解决方案2】:

    函数ssize_t getline(char **restrict lineptr, size_t *restrict n, FILE *restrict stream)(当你运行man getline时得到)和你正在使用的istream&amp; getline (istream&amp; is, string&amp; str)之间是有区别的。从第一个的手册页:

    getline() 从流中读取整行,将包含文本的缓冲区的地址存储到 *lineptr 中。缓冲区以空值结尾,并包含换行符(如果找到)。

    来自第二个的手册页:

    如果找到分隔符,则将其提取并丢弃(即不存储,下一个输入操作将在它之后开始)。

    这或许可以解释您的困惑。因此,正如其他人所说,您只需自己添加即可。

    【讨论】:

    • 请注意,您所说的第一个函数不是 ISO C++ 的一部分,而是特定于 POSIX 平台的。但是,您可能仍然是正确的,这是造成 OP 混乱的原因。另一个可能造成混淆的原因是函数 std::fgets,它是 ISO C++ 的一部分,也不会丢弃换行符。
    【解决方案3】:

    给你,你只需要连接'\n'

    while (getline(file, text))
        {
            finaltext =finaltext + "\n" + text;
        }
    
        cout << finaltext;
    

    正如 Sandburg 所说,+ 运算符几乎在 C++17 中被弃用,因此您可以在此处使用 append()insert()

    【讨论】:

    • 我可能不是最新的,但 string operator+ 几乎已被弃用:当涉及有状态分配器时(例如当 std::pmr::string被使用)(C++17 起)。在 P1165R1 之前,用于结果的分配器是由历史事故确定的,并且可以在没有明显原因的情况下因过载而异。
    • @Sandburg 你说得对,它确实已被弃用,我不知道这一点。谢谢
    猜你喜欢
    • 2011-03-12
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多