句子转换器在存在新行的情况下不起作用

Sentence converter not working in the presence of new line

本文关键字:情况下 不起作用 新行 存在 转换器 句子      更新时间:2023-10-16

我正在尝试编写一个询问用户两个文件名的程序。第一个文件将打开以进行输入,第二个文件将打开以进行输出。(可以假定第一个文件包含以一段时间结尾的句子。(程序将读取第一个文件的内容,并将所有字母更改为小写大写。修订后的内容应存储在第二个文件中。

我能够使代码正常工作,但是在线之间的突破很大:

之间。

我的输入:https://i.stack.imgur.com/iygwt.jpg

这是input.txt

的文本
C   是Bell Labs的Bjarne Stroustrup开发的"高级编程语言"。它有助于优化资源并通过网络支持多人游戏选项。Google的主页包含一个标有我很幸运的按钮。当用户键入搜索并单击按钮时,用户将直接将用户绕过第一个搜索结果,绕过搜索引擎结果页面。

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

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

#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"之间没有断裂,因为每个句子都没有分开,我的代码在句子之间没有断裂。但是,当句子之间存在断裂时,它不再正确转换。

最终目标是使我的输出文件看起来像:(请注意,转换后的句子之间没有断裂(

getline(inFile, string, '.')

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

C   是Bell Labs的Bjarne Stroustrup开发的"高级编程语言">

它有助于优化资源并通过网络支持多人游戏选项。Google的主页包含一个标有我很幸运的按钮。当用户键入搜索并单击按钮时,用户将直接将用户绕过第一个搜索结果,绕过搜索引擎结果页面。

将保留在流中。注意开始在流中剩下的数据的线路结束。这是您的错误的一部分。

string将与'.'和线路结束一起写入文件。

下一个致getline的呼叫将读取

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

进入string。看到线字符的结尾吗?它将被写入文件。现在您有两端的线路。糟糕。

解决方案:

不要手动添加线路的结尾。更改

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

to

outFile << line << ".";

如果您觉得需要完成endl

手动添加flush

首先从文件中提取整个行,然后在下一个循环中,解析定界符'。'。

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;
}