说明
注意:
问题:
插图:
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;
}
答案 0 :(得分:4)
您应该将string.getline函数用于字符串 cppreference
但是在你的情况下,你应该使用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;
}
}
}
答案 1 :(得分:1)
不是将缓冲区声明为字符串,而是将其声明为:
char buffer[MY_MAX_SIZE]
用它调用fgets,然后如果你需要那个形式而不是反过来那么从缓冲区构建字符串。
你正在做的事情不起作用的原因是你得到缓冲区内容的 copy 作为c风格的字符串,而不是指向缓冲区内容的指针。根据设计,它是只读的。
- MarkusQ
答案 2 :(得分:0)
你是对的,你无法直接阅读std::string
,因为它的c_str
和data
方法都返回const指针。您可以改为阅读std::vector<char>
。
您也可以使用getline
功能。但它需要一个iostream对象,而不是C FILE指针。但是,您可以以特定于供应商的方式从一个到另一个。有关如何从一种文件类型到另一种文件类型的图表和一些建议,请参阅“A Handy Guide To Handling Handles”。在fileno
上调用FILE*
以获取数字文件描述符,然后使用fstream::attach
将其与fstream
对象关联。然后,您可以使用getline
。
答案 3 :(得分:0)
尝试使用boost库 - 我相信它具有从FILE *
创建fstream的功能或者您可以使用fileno()从FILE获取标准C文件句柄,然后使用fstream :: attach将流附加到该文件。从那里你可以使用getline()等。像这样:
FILE *condorData = _popen ("condor_q", "r");
std::ifstream &stream = new std::ifstream();
stream.attach(_fileno(condorData));
答案 4 :(得分: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向量。