【问题标题】:Sentence converter not working in the presence of new line存在换行符时句子转换器不起作用
【发布时间】:2019-08-14 12:25:16
【问题描述】:

我正在尝试编写一个程序来询问用户两个文件名。第一个文件将被打开以供输入,第二个文件将被打开以供输出。 (假设第一个文件包含以句点结尾的句子。)程序将读取第一个文件的内容并将除每个句子的第一个字母之外的所有字母都更改为小写,这应该是大写。修改后的内容应该存放在第二个文件中。

我能够让代码正常工作,但它输出的行之间有很大的中断:

我的输入: https://imgur.com/a/pfFemjJ

这是 input.txt 的文本

c++ 是贝尔实验室的 Bjarne Stroustrup 开发的“高级编程语言”。 它有助于优化资源并支持网络多人游戏选项。 google 的主页包含一个标记为“手气不错”的按钮。 当用户输入搜索并单击按钮时,用户将被直接带到第一个搜索结果,绕过搜索引擎结果页面。

您会注意到 output.txt 中的行之间不必要的空格。我不知道为什么会这样输出。

我试图弄乱我的 while 循环,但我似乎无法调试这个问题

#include <algorithm> 
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    char ch;
    string inputNAME, outputNAME;
    string line;

    cout << "Please enter the filename for INPUT file: ";
    cin >> inputNAME;

    cout << "Please enter the filename for OUTPUT file: ";
    cin >> outputNAME;

    fstream inFile, outFile;

当“input.txt”在句子之间没有中断时,我的代码可以工作,因为每个句子都没有分隔。 但是,当句子之间有中断时,它不再正确转换。

最终目标是让我的输出文件如下所示:(注意转换后的句子之间没有中断)

【问题讨论】:

  • 从 while 循环中删除这个 inFile.get(ch); 并尝试。 string[0] 已经进行了实际的转换,从文件中提取一个字符将改变文件索引。
  • 那没有成功。我能够解决转换问题(现在每个句子的开头都是一个大写字母)。但是,句子之间仍然有这些奇怪的中断,我似乎无法摆脱。有什么想法吗?
  • string string; 是一件非常危险的事情。此后,string 不再是类型,而是变量。如果您在此之后尝试创建另一个 string 变量,这可能会造成严重破坏。此外,它不包含有关如何使用string 的任何信息。
  • “句子”的定义是什么? “The U.S.A. is a country in North America.”一共有多少个句子?
  • 就我而言,这是一个以句点结尾的声明

标签: c++


【解决方案1】:
getline(inFile, string, '.')

将读取直到第一个 '.' 的所有文本。给定输入,string 将包含

c++ 是贝尔实验室的 Bjarne Stroustrup 开发的“高级编程语言”

它有助于优化资源并支持网络多人游戏选项。 google 的主页包含一个标记为“手气不错”的按钮。 当用户输入搜索并单击按钮时,用户将被直接带到第一个搜索结果,绕过搜索引擎结果页面。

将保留在流中。请注意流中剩余数据的开始行的结尾。这是您的错误的一部分。

string 将与'.' 和行尾一起写入文件。

getline 的下一次调用将显示

它有助于优化资源并支持网络多人游戏选项。

进入string。看到行尾字符了吗?它将被写入文件。现在你有两个行尾。哎呀。

解决方案:

不要手动添加行尾。改变

outFile << line << "." << endl;

outFile << line << ".";

如果您觉得需要填写endl,请手动添加flush

【讨论】:

  • 我替换了 outFile imgur.com/a/YpVgXf3 更改似乎并没有消除额外的中断
  • @Dwight 看看输出文件。这是我建议更正的唯一部分。如果您希望控制台具有相同的输出,则必须对 cout &lt;&lt; string &lt;&lt; "." &lt;&lt; endl; 进行相同的修改。
  • 代码对我有用,我只是无法让它显示在 output.txt 中(由于某种原因它只显示在我的终端窗口中)。您介意运行它以查看它是否正确显示到 output.txt 吗?
  • @Dwight 在发布答案之前我运行了你的代码减去endl 我建议删除并得到一个与你的图像中的文件匹配的文件。从字面上看,您的代码需要达到预期的唯一更改是删除两个endls,因此如果您在我的解决方案和 secpur 的解决方案中运行混合,可能会发生奇怪的蓝精灵,您已经学到了一个有用的教训:备份您的调试之前的代码,这样您就可以 A) 跟踪多个线程 B) 如果修复没有修复,则可以轻松返回 C) 有一些东西可以比较以验证修复是否有效。
  • 也就是说,您的预期可能不是您想要的。代码去大写“Bjarne Stroustrup”。您可能需要一个更智能的解析器。
【解决方案2】:

首先从文件中提取整行,然后在下一个循环中,解析分隔符'.',就像这样

while (getline(inFile, string))
{
    stringstream sstream{ string };
    while (getline(sstream, string, '.')) {

        transform(string.begin(), string.end(), string.begin(), ::tolower);

        int i = 0;
        bool contains_alpha
            = std::find_if(string.begin(), string.end(), [&i](char c) { i++; return std::isalpha(c); }) != string.end();

        if (!contains_alpha) continue;
        string[i - 1] = toupper(string[i - 1]);

        cout << string << ".";
        outFile << string << ".";
    }
    cout << endl;
    outFile << endl;
}

【讨论】:

  • 确实发生的一件事是我的输出中有一个额外的句点?你知道为什么会这样吗?这就是问题所在:imgur.com/a/g7LqGDc 你会注意到现在每个句子都有 2 个句点。
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 2021-12-25
  • 2021-12-23
  • 2014-09-12
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多