2015-02-24 81 views
1

我有这样的代码用于从文件中读取:的std ::函数getline使用char *为字符串

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

第一个'LoadObject()'指定一个文件路径。第二个应该做的是什么? – NathanOliver 2015-02-24 17:26:47

回答

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); 
} 

一些小票:

  • filePath通过const引用,因为你不改变它,不需要副本。
  • 使buffer a const char *如果它是一个C字符串,因为你不需要修改它。最好使用一个知道长度的参数,而不是依靠调用者来同步这两个参数。
  • 考虑按值返回MyObject,除非您确实需要指针。
  • 考虑以不同的方式命名LoadObject这两个重载来表达他们的意图。对于所有的调用者都知道,C字符串重载也可以是文件路径。
2

我不知道它会表现良好,但你可以做这样的事情:

std::istringstream iss(std::string(buffer, length)); 
while (getline(iss, currentLine)) 
{ ... } 
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私人等等,但这些细节的实施。

相关问题