我正在开发一个小型导出功能,我需要编写由 6x 组成的 100 万行doubles
。不幸的是,读取数据的工具需要用逗号替换点。我现在转换它们的方式是在编辑器中手动替换,这对于大约 20MB 的文件来说既麻烦又非常慢。
有没有办法在写作时进行这种转换?
我正在开发一个小型导出功能,我需要编写由 6x 组成的 100 万行doubles
。不幸的是,读取数据的工具需要用逗号替换点。我现在转换它们的方式是在编辑器中手动替换,这对于大约 20MB 的文件来说既麻烦又非常慢。
有没有办法在写作时进行这种转换?
使用类似的工具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 );
}
我会利用 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 ','