std::getline,其中char*为字符串
std::getline with char* to strings
我有以下代码用于从文件中读取:
MyObject* LoadObject(wstring filePath)
{
ifstream fileReader;
fileReader.open(filePath);
if (fileReader.is_open())
{
string currentLine;
//std::basic_istream &std::getline
while (getline(fileReader, currentLine))
{
//Logic for loading MyObject* here
}
}
}
现在我也希望能够从char*缓冲区中读取,有没有一种方法可以保持相同的读取逻辑,只是改变我读取行的方式?
MyObject* LoadObject(char* buffer, ulong length)
{
//Change how I read each line
//Keep the same logic for loading MyObject*
}
将您的工作转移到需要std::istream &
才能读取的内容中:
MyObject *ReadObject(std::istream &is)
{
string currentLine;
while (getline(is, currentLine))
{
//Logic for loading MyObject* here
}
}
现在让你的其他功能使用这个:
MyObject* LoadObject(wstring filePath)
{
ifstream fileReader;
fileReader.open(filePath);
if (fileReader.is_open())
{
return ReadObject(fileReader);
}
... //return something else
}
MyObject* LoadObject(char* buffer, ulong length)
{
std::string str(buffer, length);
std::istringsteam iss(str);
return ReadObject(iss);
}
一些小提示:
- 通过const引用传递
filePath
,因为您不需要更改它,也不需要副本 - 如果是C字符串,则将
buffer
设为const char *
,因为您不需要修改它。最好使用一个知道长度的参数,而不是依赖调用方来同步这两个参数 - 除非您真的需要指针,否则请考虑按值返回
MyObject
- 考虑以不同的方式命名
LoadObject
的两个重载,以传达它们的意图。据调用者所知,C字符串重载也可能是一个文件路径
我不确定它是否会表现良好,但你可以这样做:
std::istringstream iss(std::string(buffer, length));
while (getline(iss, currentLine))
{ ... }
您应该修改现有的方法,并将实际读取的代码放入单独的方法中:
MyObject* LoadObjectFromStream(std::istream &in)
{
string currentLine;
//std::basic_istream &std::getline
while (getline(fileReader, currentLine))
{
//Logic for loading MyObject* here
}
}
然后在两种变体中使用此方法:
MyObject* LoadObject(wstring filePath)
{
ifstream fileReader;
fileReader.open(filePath);
if (fileReader.is_open())
return loadObjectFromStream( fileReader );
}
MyObject* LoadObject(const char *buffer, size_t size )
{
istrstream stream( buffer, size );
return loadObjectFromStream( stream );
}
您可能想将LoadObjectFromStream
设为私有等,但这是实现的细节。