1

我正在开发一个小型导出功能,我需要编写由 6x 组成的 100 万行doubles。不幸的是,读取数据的工具需要用逗号替换点。我现在转换它们的方式是在编辑器中手动替换,这对于大约 20MB 的文件来说既麻烦又非常慢。

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

4

2 回答 2

4

使用类似的工具tr比手动操作要好,应该是您的首选。否则,通过过滤 streambuf 输入相当简单,它将 all 转换'.'',',甚至仅在特定上下文中转换(例如,当前面或后面的字符是数字时)。没有上下文:

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 );
}
于 2012-12-29T15:50:44.073 回答
0

我会利用 c++ Algotithm 库std::replace来完成工作。将整个文件读入 astring并调用 replace:

std::string s = SOME_STR; //SOME_STR represents the set of data 
std::replace( s.begin(), s.end(), '.', ','); // replace all '.' to ','
于 2012-12-29T15:41:00.733 回答