C++ 如果我的输入超过多行,我需要输出也超过多行

C++ 如果我的输入超过多行,我需要输出也超过多行,c++,C++,我创建了一个程序,可以反转句子中每个单词的字母。我输入文本到一个输入文本文件超过4行。输出文本都在一行上,但我需要这样,当输入转到下一行时,输出也是如此 字符串反转(字符串字) { int n; for(int i=0;i>word){ out使用std::getline()从输入中读取单独的文本行,然后使用std::istringstream遍历每行的单独单词: #包括 #包括 #包括 #包括 #include我想有很多可能的解决方案。我将向您展示一段大量使用std库的代码,因此只需要几行代码

我创建了一个程序,可以反转句子中每个单词的字母。我输入文本到一个输入文本文件超过4行。输出文本都在一行上,但我需要这样,当输入转到下一行时,输出也是如此

字符串反转(字符串字)
{
int n;
for(int i=0;i>word){
out使用
std::getline()
从输入中读取单独的文本行,然后使用
std::istringstream
遍历每行的单独单词:

#包括
#包括
#包括
#包括

#include

我想有很多可能的解决方案。我将向您展示一段大量使用std库的代码,因此只需要几行代码。有趣的工作将在函数main中的3条代码语句中完成。没有像
do
while
for
或其他c需要控制结构

<>这是一个现代的C++风格。

#包括
#包括
#包括
#包括
#包括
#包括
#包括
struct WordsInLine//一行中的单词+输出迭代器的代理
{
std::vector wordsInLine;//一行字的容器
friend std::ostream&operator>(std::istream&is,Line&Line){
标准:字符串整行;
std::正则表达式空间(“[\\.\\,]”);
line.words.wordsInLine.clear();
std::getline(is,wholeLine);//阅读一整行并将其拆分为多个部分
复制(
std::sregex_token_迭代器(wholeLine.begin(),wholeLine.end(),空格,-1),
std::sregex_token_迭代器(),
std::back_插入器(line.words.wordsInLine)
);
回报是;
}
运算符WordsInLine()const{return words;}//强制转换为所需结果
WordsInLine words;//行中所有单词的本地存储
};
int main()
{
std::ifstream infirestream{“r:\\input.txt”};//打开输入文件。将由析构函数关闭
std::ofstream outFileStream{“r:\\output.txt”};//打开输出文件。将由析构函数关闭
//1.将完整的输入文件读入内存,并将其逐行组织成单词
所有行所有行{std::istream_迭代器(infiestream),std::istream_迭代器();
//2.对于所有行:反转一行中的所有单词
std::每个(
allLines.begin(),allLines.end(),
[](文字行和w){
std::每个(
w、 wordsInLine.begin(),w.wordsInLine.end(),
[](std::string&s){std::reverse(s.begin(),s.end());}
);
}
);
//3.将结果输出到文件
复制(
allLines.begin(),allLines.end(),
std::ostream_迭代器{outFileStream,“\n”}
);
返回0;
}
我对输入和输出迭代器使用代理。输入迭代器额外解析该行并提取所有单词。请注意:使用正则表达式,我会在解析的单词中额外删除“.”和“.”

反向操作通过嵌套的
std::for_each()
和嵌套的lambda实现


希望这有帮助。

一种避免使用正则表达式的替代解决方案可以简单地反转每个单词(如果需要,
。首先查找包含标点符号列表的()
,然后从该位置删除()。一种相当直接的方法是使用
getline
读取每一行,然后从该行创建一个
stringstream
,然后从
stringstream
读取每个单词,输出到输出文件。可以使用一个简单的标志来控制每个单词之间的空格添加

不删除标点符号的简短实现可以是:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

std::string reverse (const std::string& s)
{
    return std::string (s.rbegin(), s.rend());
}

int main (int argc, char **argv)
{
    std::string line;   /* string to hold each line */

    if (argc < 3) {     /* validate 2 arguments given */
        std::cerr << "error: insufficient input.\nusage: ifile ofile\n";
        return 1;
    }

    std::ifstream ifs {argv[1]};        /* open input file */
    std::ofstream ofs {argv[2]};        /* open output file */

    while (getline (ifs, line)) {       /* read each line */
        std::istringstream ss {line};   /* create stringstream from line */
        std::string word;               /* string to hold word */
        size_t wc = 0;                  /* flag to control space output */
        while (ss >> word)              /* read each word */
            ofs << (wc++ ? " " : "") << reverse (word); /* output rev'ed */
        ofs << '\n';    /* tidy up with newline */
    }
}
示例使用

$ cat ../dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
$ ./bin/words_reverse ../dat/captnjack.txt ../dat/captnjack_rev.txt
$ cat ../dat/captnjack_rev.txt
sihT si a elat
fO niatpaC kcaJ worrapS
A etariP oS evarB
nO eht neveS .saeS
$ cat dat/sentences.txt
Expecting the world to treat you
fairly because you are a good person
is a little like expecting the bull not to
attack you because you are a vegetarian.
$ ./bin/words_reverse_w_punc dat/sentences.txt dat/sentences_rev.txt
$ cat dat/sentences_rev.txt
gnitcepxE eht dlrow ot taert uoy
ylriaf esuaceb uoy era a doog nosrep
si a elttil ekil gnitcepxe eht llub ton ot
kcatta uoy esuaceb uoy era a nairategev.
示例输出文件

$ cat ../dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
$ ./bin/words_reverse ../dat/captnjack.txt ../dat/captnjack_rev.txt
$ cat ../dat/captnjack_rev.txt
sihT si a elat
fO niatpaC kcaJ worrapS
A etariP oS evarB
nO eht neveS .saeS
$ cat dat/sentences.txt
Expecting the world to treat you
fairly because you are a good person
is a little like expecting the bull not to
attack you because you are a vegetarian.
$ ./bin/words_reverse_w_punc dat/sentences.txt dat/sentences_rev.txt
$ cat dat/sentences_rev.txt
gnitcepxE eht dlrow ot taert uoy
ylriaf esuaceb uoy era a doog nosrep
si a elttil ekil gnitcepxe eht llub ton ot
kcatta uoy esuaceb uoy era a nairategev.

根据您的输入/输出帖子进行编辑

如果要删除单词末尾的标点符号,可以使用
.find_first_of()
.erase()
。由于现在要将标点符号移动到找到标点符号的单词末尾,因此需要先保存字符,然后再执行
.erase()
将其从单词中删除。然后您可以将其添加到单词后面。通过删除标点符号并移动到单词末尾,您可以执行以下操作:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

std::string reverse (const std::string& s)
{
    return std::string (s.rbegin(), s.rend());
}

int main (int argc, char **argv)
{
    std::string line;   /* string to hold each line */
    const std::string rmchars {".,!?"}; /* punctuation to remove */

    if (argc < 3) {     /* validate 2 arguments given */
        std::cerr << "error: insufficient input.\nusage: ifile ofile\n";
        return 1;
    }

    std::ifstream ifs {argv[1]};        /* open input file */
    std::ofstream ofs {argv[2]};        /* open output file */

    while (getline (ifs, line)) {       /* read each line */
        std::istringstream ss {line};   /* create stringstream from line */
        std::string word;               /* string to hold word */
        size_t wc = 0;                  /* flag to control space output */
        while (ss >> word) {            /* read each word */
            size_t rmpos = word.find_first_of (rmchars);  /* index or npos */
            char punc = 0;              /* char to hold punctuation */
            if (rmpos != std::string::npos) { /* if not npos */
                punc = word[rmpos];     /* save punctuation char */
                word.erase (rmpos);     /* erase punctuation */
            }
            ofs << (wc++ ? " " : "") << reverse (word); /* output rev'ed */
            if (punc)
                ofs << (char)punc;      /* output punctuation char */
        }
        ofs << '\n';                    /* tidy up with newline */
    }
}
示例使用

$ cat ../dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
$ ./bin/words_reverse ../dat/captnjack.txt ../dat/captnjack_rev.txt
$ cat ../dat/captnjack_rev.txt
sihT si a elat
fO niatpaC kcaJ worrapS
A etariP oS evarB
nO eht neveS .saeS
$ cat dat/sentences.txt
Expecting the world to treat you
fairly because you are a good person
is a little like expecting the bull not to
attack you because you are a vegetarian.
$ ./bin/words_reverse_w_punc dat/sentences.txt dat/sentences_rev.txt
$ cat dat/sentences_rev.txt
gnitcepxE eht dlrow ot taert uoy
ylriaf esuaceb uoy era a doog nosrep
si a elttil ekil gnitcepxe eht llub ton ot
kcatta uoy esuaceb uoy era a nairategev.
示例输出文件

$ cat ../dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
$ ./bin/words_reverse ../dat/captnjack.txt ../dat/captnjack_rev.txt
$ cat ../dat/captnjack_rev.txt
sihT si a elat
fO niatpaC kcaJ worrapS
A etariP oS evarB
nO eht neveS .saeS
$ cat dat/sentences.txt
Expecting the world to treat you
fairly because you are a good person
is a little like expecting the bull not to
attack you because you are a vegetarian.
$ ./bin/words_reverse_w_punc dat/sentences.txt dat/sentences_rev.txt
$ cat dat/sentences_rev.txt
gnitcepxE eht dlrow ot taert uoy
ylriaf esuaceb uoy era a doog nosrep
si a elttil ekil gnitcepxe eht llub ton ot
kcatta uoy esuaceb uoy era a nairategev.

解决这个问题的方法有很多。你可以根据需要使它变得简单或复杂。

请给出一个输入和输出的例子好吗?幸运的是,
>
操作符在流中留下了任何分隔空白。你如何利用这一点来确定是否需要在输出中开始一行新行put?如果要解释行,则需要读取行。
运算符>>
忽略行。您可能需要研究名称中有“行”一词的函数。@OznOg,我添加了一个输入和所需输出的示例