std :: getline with char * to strings

时间:2015-02-24 17:22:34

标签: c++

我有这个代码用于从文件中读取:

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*
}

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

我不确定它会表现不错,但你可以这样做:

std::istringstream iss(std::string(buffer, length));
while (getline(iss, currentLine))
{ ... }

答案 2 :(得分:2)

您应该修改现有方法并将实际阅读代码转换为单独的方法:

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设为私有等,但实施细节。