我正在开发一个小型导出函数,我需要编写包含6x doubles
的1百万行。不幸的是,读取数据的工具需要用逗号替换点。我现在转换它们的方法是在编辑器中手动替换,这对于大约20MB的文件来说很麻烦且速度极慢。
写作时有没有办法进行这种转换?
答案 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 ','