擅长:python、mysql、java
<p>您是正确的:正如所写的,代码是重复的(并且没有错误检查)。您读取的每个字段实际上需要采取三到五个步骤,具体取决于要读取的数据类型:</p>
<ol>
<li>从流中读取字段</li>
<li>确保读取成功</li>
<li>分析数据(如有必要)</li>
<li>确保解析成功(如有必要)</li>
<li>将数据复制到目标位置</li>
</ol>
<p>您可以将这三个代码打包成一个函数,这样代码的重复性就更少了。例如,考虑以下函数模板:</p>
<pre><code>template <typename TStream, typename TResult>
void ReadFixedWidthFieldFromStream(TStream& str, TResult& result, unsigned sz)
{
std::vector<char> data(sz);
if (!str.read(&data[0], sz))
throw std::runtime_error("Failed to read from stream");
std::stringstream ss(&data[0]);
if (!(ss >> result))
throw std::runtime_error("Failed to parse data from stream");
}
// Overload for std::string:
template <typename TStream>
void ReadFixedWidthFieldFromStream(TStream& str, std::string& result, unsigned sz)
{
std::vector<char> data(sz);
if (!str.read(&data[0], sz))
throw std::runtime_error("Failed to read from stream");
result = std::string(&data[0], sz);
}
</code></pre>
<p>现在您的代码可以更加简洁:</p>
^{pr2}$