1

这是我几分钟前刚问的一个问题的翻版。基本上我希望显示的换行符比换行符的数量少一。因此,如果连续三个新行,则换行符应该是两个。有没有办法做到这一点?

while( infile.get( ch ) ) 
{
  switch( ch )
  {
    case '\n':
        outfile << "<br />";
        break;
    case '\t':
        outfile << tab;
        break;
    case '&':
        outfile << "&amp;";
        break;
    case '<':
            outfile << "&lt;";
        break;
    case '>':
            outfile << "&gt;";
        break;
    case '"':
            outfile << "&quot;";
        break;
    default:
        outfile << ch;
        break;
 }  

if( ch == '\n' )
 {
   inputLines++;
 }

}

示例输出应如下所示:https ://gist.github.com/anonymous/b5a647913f83f796914c

4

2 回答 2

0

为了解决这个问题,你必须检测到你有“多个相同的”,这意味着构建一个状态机。

一个简单的版本,只处理你正在做的事情是有一个“peek-buffer”;

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

我敢肯定还有其他聪明的方法可以做到这一点。

于 2013-07-10T13:58:29.527 回答
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 << "&amp;";
            break;

        case '<':
            outfile << "&lt;";
            break;

        case '>':
            outfile << "&gt;";
            break;

        case '"':
            outfile << "&quot;";
            break;

        default:
            outfile << ch;
            break;
    }

    if( ch == '\n' )
    {
        inputLines++;

    } else {
        first_nl = true;
    }
}

使用它,您将不必处理下一个字符的任何“偷看”。

于 2013-07-10T15:04:16.170 回答