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字符串,则将
    buffer
    a
    const char*
    ,因为不需要修改它。最好使用一个知道长度的参数,而不是依赖调用者来同步这两个参数
  • 考虑按值返回
    MyObject
    ,除非您确实需要指针
  • 考虑以不同的方式命名
    LoadObject
    的两个重载,以传达它们的意图。调用方都知道,C字符串重载也可能是一个文件路径

将您的工作转移到需要读取
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字符串,则将
    buffer
    a
    const char*
    ,因为不需要修改它。最好使用一个知道长度的参数,而不是依赖调用者来同步这两个参数
  • 考虑按值返回
    MyObject
    ,除非您确实需要指针
  • 考虑以不同的方式命名
    LoadObject
    的两个重载,以传达它们的意图。调用方都知道,C字符串重载也可能是一个文件路径

您应该修改现有的方法,并将实际读取的代码放入单独的方法中:

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()
指定一个文件路径。第二个应该做什么?