0

我在最新的 macOS 上编译了这个程序来从文件中读取字符串。

我使用的命令:clang++ -std=c++17 -stdlib=libc++ sc_test.cc

后跟:./a.out document1_short.txt

#include <iostream>
#include <fstream>
using namespace std;

int testSpellingWrapper(int argument_count, char** argument_list) {
     const string document_filename(argument_list[1]);
     ifstream indoc;
     string sentence;
     indoc.open(document_filename);
     while(getline(indoc, sentence)){
          cout<<sentence<<"111"<<endl;
     }
     indoc.close();
     return 0;
}

int main(int argc, char **argv) {
  testSpellingWrapper(argc, argv);
  return 0;
}

但是,它不能正确计算。出现111在覆盖前两个字母的句子的顶部。我必须cout将字符串和其他东西一起用于编程作业。

文档中的文本

这是帕特尔决定的完整记录,
 口头发布,其中她解释了授予的依据
 禁令。因为它标志着第一次
 法官已就在线案件作出裁决
 音乐交换,帕特尔对 lwa 的解释很可能
 在随后的案例中被广泛引用并且将是至关重要的
 上诉法院处理此案。

输出

111is 是帕特尔决定的完整记录,该决定是
111 口头起诉,其中她解释了授予的依据
111e 禁令。因为它标志着第一次
111dge已就在线案例下达决策
111sic-swapping,Patel 对 lwa 的解释很可能
111 在随后的案例中被广泛引用,将是至关重要的
111 上诉法院处理此案。
4

1 回答 1

1

(我假设您没有在 Windows 或 DOS 上运行。)

发生的情况是您的输入文件行以字符序列 0x13 0x10 或“回车”和“换行”结尾。这是 DOS 风格的行尾,它告诉老式打印机: 1. 将打印头移动到行首。2. 下移一行(“进纸”)。

现在,std::getline()去掉 0x10 字符(大多数操作系统上的换行符或换行符),但您的sentence. 当您打印它时,您会在打印最后两个字符之前回到行首,即"aa".

所以,程序也在做你告诉它的事情......

建议:执行以下操作之一:

  • dos2unix在您的输入文件上运行
  • 以不同方式生成输入文件
  • 从 's 的末尾删除\r's (0x13, 回车) 字符sentence

另请参阅:让 std :: ifstream 处理 LF、CR 和 CRLF?

编辑:在网站上,您粘贴的 CRLF 对显示为行尾对 - 一种不同的“解释”。

于 2020-04-02T22:38:36.250 回答