std::getline,其中char*为字符串

std::getline with char* to strings

本文关键字:字符串 char 其中 getline std      更新时间:2023-10-16

我有以下代码用于从文件中读取:

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设为私有等,但这是实现的细节。

相关文章: