C++ std::getline,带char*to字符串
我有以下代码用于读取文件:C++ std::getline,带char*to字符串,c++,C++,我有以下代码用于读取文件: MyObject* LoadObject(wstring filePath) { ifstream fileReader; fileReader.open(filePath); if (fileReader.is_open()) { string currentLine; //std::basic_istream &std::getline while (getline(fileR
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::istringstream iss(std::string(buffer, length));
while (getline(iss, currentLine))
{ ... }
我不确定它是否会表现良好,但您可以这样做:
std::istringstream iss(std::string(buffer, length));
while (getline(iss, currentLine))
{ ... }
将您的工作转移到需要读取
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);
}
一些小提示:
- 通过常量引用传递
,因为您不需要更改它,也不需要副本filePath
- 如果是C字符串,则将
abuffer
,因为不需要修改它。最好使用一个知道长度的参数,而不是依赖调用者来同步这两个参数const char*
- 考虑按值返回
,除非您确实需要指针MyObject
- 考虑以不同的方式命名
的两个重载,以传达它们的意图。调用方都知道,C字符串重载也可能是一个文件路径LoadObject
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);
}
一些小提示:
- 通过常量引用传递
,因为您不需要更改它,也不需要副本filePath
- 如果是C字符串,则将
abuffer
,因为不需要修改它。最好使用一个知道长度的参数,而不是依赖调用者来同步这两个参数const char*
- 考虑按值返回
,除非您确实需要指针MyObject
- 考虑以不同的方式命名
的两个重载,以传达它们的意图。调用方都知道,C字符串重载也可能是一个文件路径LoadObject
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
设置为私有等,但这需要详细的实现。您应该修改现有的方法,并将实际读取的代码放入单独的方法中:
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
设置为私有等,但这是实现的详细信息。第一个LoadObject()
指定了文件路径。第二个应该做什么?第一个LoadObject()
指定一个文件路径。第二个应该做什么?