2009-03-02 22 views
1

说明:替代fgets()?

  • 从可执行获得输出

注:

  • 将不能编译,由于与fgets()声明

Question:

  • fgets的最佳选择是什么,因为fgets需要char *?
  • 有没有更好的选择?

插图:

void Q_analysis (const char *data) 
{ 
string buffer; 
size_t found; 
found = buffer.find_first_of (*data); 

FILE *condorData = _popen ("condor_q", "r"); 
while (fgets (buffer.c_str(), buffer.max_size(), condorData) != NULL) 
{ 
    if (found == string::npos) 
    { 
     Sleep(2000); 
    } else { 
     break; 
    } 
} 
return; 
} 

回答

4

您应该使用字符串 cppreference

你的情况不过

的string.getline功能,您应该使用一个char []读入。

string s; 
char buffer[ 4096 ]; 
fgets(buffer, sizeof(buffer), condorData); 
s.assign(buffer, strlen(buffer)); 

或代码:

void Q_analysis(const char *data) 
{ 
    char buffer[ 4096 ]; 

    FILE *condorData = _popen ("condor_q", "r"); 
    while(fgets(buffer, sizeof(buffer), condorData) != NULL) 
    { 
     if(strstr(buffer, data) == NULL) 
     { 
       Sleep(2000); 
     } 
     else 
     { 
       break; 
     } 
    } 
} 
+0

不适用于FILE * – 2009-03-02 17:07:09

+0

ya,我重新阅读了这个问题,并意识到它是一个管道。 – sfossen 2009-03-02 17:08:18

1

相反的声明你缓冲区作为一个字符串声明它,就像这样:

char buffer[MY_MAX_SIZE] 

与呼叫与fgets和然后从缓冲区中建立字符串,如果你需要的是这种形式而不是另一种方式。

你在做什么不起作用的原因是你得到一个拷贝作为c风格的字符串,而不是缓冲区的指针。它的设计是只读的。

- MarkusQ

0

你说得对,你不能直接读入一个std::string,因为它的c_strdata方法均返回const的指针。相反,您可以读入std::vector<char>。您也可以使用getline函数。但它需要一个iostream对象,而不是C FILE指针。不过,您可以通过特定于供应商的方式从一个到另一个。有关如何从一种文件类型转换为另一种文件类型的图表和一些建议,请参见“A Handy Guide To Handling Handles”。在FILE*上调用fileno以获取数字文件描述符,然后使用fstream::attach将其与fstream对象关联。然后你可以使用getline

0

尝试Boost库 - 我相信它有一个功能从文件*

或者你可以使用的fileno()创建一个fstream的从文件中获取一个标准的C文件句柄,然后使用fstream的::附加以将流附加到该文件。从那里,你可以使用函数getline(),等事情是这样的:

FILE *condorData = _popen ("condor_q", "r"); 
std::ifstream &stream = new std::ifstream(); 
stream.attach(_fileno(condorData)); 
0

我没有测试过这一切太顺利,但低于似乎做的工作:

//! read a line of text from a FILE* to a std::string, returns false on 'no data' 
bool stringfgets(FILE* fp, std::string& line) 
{ 
    char buffer[1024]; 
    line.clear(); 

    do { 
    if(!fgets(buffer, sizeof(buffer), fp)) 
     return !line.empty(); 

    line.append(buffer); 
    } while(!strchr(buffer, '\n')); 
    return true; 
} 

注意然而,这将愉快地阅读100G文本行,所以必须注意,这不是来自不可信源文件或套接字的DoS向量。