这是我几分钟前刚问过的一个问题的翻版。基本上我想要显示一个比新行回车数少一个的换行符。因此,如果一行中有三个新行,则换行符应为两行。有没有办法做到这一点?
while( infile.get( ch ) )
{
switch( ch )
{
case '\n':
outfile << "<br />";
break;
case '\t':
outfile << tab;
break;
case '&':
outfile << "&";
break;
case '<':
outfile << "<";
break;
case '>':
outfile << ">";
break;
case '"':
outfile << """;
break;
default:
outfile << ch;
break;
}
if( ch == '\n' )
{
inputLines++;
}
}
示例输出应如下所示:https://gist.github.com/anonymous/b5a647913f83f796914c
答案 0 :(得分:0)
要解决此问题,您必须检测到您具有“多个相同”,这意味着要构建各种状态机。
一个简单的版本,只处理你正在做的事情就是拥有一个“窥视缓冲区”;
#include <fstream>
#include <iostream>
using namespace std;
int buffer = 0;
int peek(ifstream &infile)
{
if (buffer) return buffer;
char ch;
if (!infile.get( ch ))
buffer = -1;
else
buffer = ch;
return buffer;
}
int get(ifstream &infile)
{
int ch = peek(infile);
buffer = 0;
cout << "ch = " << ch << endl;
return ch;
}
int main(int argc, char **argv)
{
ifstream infile(argv[1]);
ofstream outfile(argv[2]);
int ch;
while( (ch = get(infile)) != -1 )
{
int count = 0;
switch( ch )
{
case '\n':
while (peek(infile) == '\n')
{
count ++;
get(infile);
}
count--; // One less.
if (count <= 0) count = 1; // Assuming we want one output if there is only one.
for(int i = 0; i < count; i++)
{
outfile << "<br />";
}
break;
default:
outfile << (char)ch;
break;
}
}
}
我确信还有其他聪明的方法可以做到这一点。
答案 1 :(得分:0)
这可能适合你。基本上它会跳过检测到的第一个换行符。如果你有3个换行输入,你将有2个换行符。请注意,如果您只有一个换行符,则只会获得换行符(不是换行符)。
bool first_nl = true;
while( infile.get( ch ) )
{
switch( ch )
{
case '\n':
if ( first_nl ) {
outfile << "\n";
first_nl = false;
} else {
outfile << "<br />\n";
}
break;
case '\t':
outfile << tab;
break;
case '&':
outfile << "&";
break;
case '<':
outfile << "<";
break;
case '>':
outfile << ">";
break;
case '"':
outfile << """;
break;
default:
outfile << ch;
break;
}
if( ch == '\n' )
{
inputLines++;
} else {
first_nl = true;
}
}
使用此功能,您无需在下一个角色处理任何“偷看”。