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