写入文件时将双点转换为逗号

时间:2012-12-29 15:34:43

标签: c++

我正在开发一个小型导出函数,我需要编写包含6x doubles的1百万行。不幸的是,读取数据的工具需要用逗号替换点。我现在转换它们的方法是在编辑器中手动替换,这对于大约20MB的文件来说很麻烦且速度极慢。

写作时有没有办法进行这种转换?

2 个答案:

答案 0 :(得分:4)

使用像tr这样的工具比手动做更好 应该是你的第一选择。否则,它很简单 通过过滤streambuf输入,过滤所有'.'',',甚至仅在特定情境下进行转换(当时为 例如,前面或后面的字符是数字。 没有上下文:

class DotsToCommaStreambuf : public std::streambuf
{
    std::streambuf* mySource;
    std::istream* myOwner;
    char myBuffer;
protected:
    int underflow()
    {
        int ch = mySource->sbumpc();
        if ( ch != traits_type::eof() ) {
            myBuffer = ch == '.' ? ',' : ch;
            setg( &myBuffer, &myBuffer, &myBuffer + 1 );
        }
    }
public:
    DotsToCommaStreambuf( std::streambuf* source )
        : mySource( source )
        , myOwner( NULL )
    {
    }
    DotsToCommaStreambuf( std::istream& stream )
        : mySource( stream.rdbuf() )
        , myOwner( &stream )
    {
        myOwner->rdbuf( this );
    }
    ~DotsToCommaStreambuf()
    {
        if ( myOwner != NULL ) {
            myOwner.rdbuf( mySource );
        }
    }
}

使用此类包装输入源:

DotsToCommaStreambuf s( myInput );

只要s在范围内,myInput就会转换所有'.' 它在','的输入中看到。

编辑:

我已经看到了您希望更改发生的评论 在生成文件时,而不是在阅读时。该 原则是相同的,除了过滤streambuf ostream所有者,并覆盖overflow( int ),而不是 underflow。在输出时,您不需要本地缓冲区,所以 它甚至更简单:

int overflow( int ch )
{
    return myDest->sputc( ch == '.' ? ',' : ch );
}

答案 1 :(得分:0)

我会使用c ++算法库并使用std::replace来完成工作。将整个文件读入string并调用replace:

std::string s = SOME_STR; //SOME_STR represents the set of data 
std::replace( s.begin(), s.end(), '.', ','); // replace all '.' to ','