输出文件转换问题

时间:2013-07-10 13:49:48

标签: c++ html html-entities

这是我几分钟前刚问过的一个问题的翻版。基本上我想要显示一个比新行回车数少一个的换行符。因此,如果一行中有三个新行,则换行符应为两行。有没有办法做到这一点?

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

2 个答案:

答案 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 << "&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;
    }
}

使用此功能,您无需在下一个角色处理任何“偷看”。