Windows fgets()的替代方案?
说明: 从可执行文件获取输出 注: 由于fgets声明,将不会编译 问题: 由于fgets需要字符*,fgets的最佳替代方案是什么? 有更好的选择吗? 说明:Windows fgets()的替代方案?,windows,visual-c++,Windows,Visual C++,说明: 从可执行文件获取输出 注: 由于fgets声明,将不会编译 问题: 由于fgets需要字符*,fgets的最佳替代方案是什么? 有更好的选择吗? 说明: 您应该对字符串使用string.getline函数 但是,在您的情况下,应该使用char[]来读取 乙二醇 或您的代码: void Q_analysis( const char *data ) { char buffer[ 4096 ]; FILE *condorData = _popen ("condor_q",
您应该对字符串使用string.getline函数 但是,在您的情况下,应该使用char[]来读取 乙二醇 或您的代码:
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;
}
}
}
您应该对字符串使用string.getline函数 但是,在您的情况下,应该使用char[]来读取 乙二醇 或您的代码:
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;
}
}
}
与其将缓冲区声明为字符串,不如将其声明为:
char buffer[MY_MAX_SIZE]
使用该函数调用fgets,然后根据需要从缓冲区中构建字符串,而不是相反
您所做的工作不起作用的原因是,您将缓冲区内容的副本作为c样式的字符串,而不是指向缓冲区内部的指针。根据设计,它是只读的
-MarkusQ不是将缓冲区声明为字符串,而是将其声明为如下内容:
char buffer[MY_MAX_SIZE]
使用该函数调用fgets,然后根据需要从缓冲区中构建字符串,而不是相反
您所做的工作不起作用的原因是,您将缓冲区内容的副本作为c样式的字符串,而不是指向缓冲区内部的指针。根据设计,它是只读的
-MarkusQ您是对的,您不能直接读入std::string,因为它的c_str和data方法都返回常量指针。您可以读入std::vector
您还可以使用getline函数。但它需要一个iostream对象,而不是一个C文件指针。不过,您可以通过特定于供应商的方式从一个供应商获得另一个供应商。有关如何从一种文件类型转换到另一种文件类型的图表和一些建议,请参见。对文件*调用fileno以获取数字文件描述符,然后使用fstream::attach将其与fstream对象关联。然后您可以使用getline。您是对的,您不能直接读入std::string,因为它的c_str和data方法都返回常量指针。您可以读入std::vector
您还可以使用getline函数。但它需要一个iostream对象,而不是一个C文件指针。不过,您可以通过特定于供应商的方式从一个供应商获得另一个供应商。有关如何从一种文件类型转换到另一种文件类型的图表和一些建议,请参见。对文件*调用fileno以获取数字文件描述符,然后使用fstream::attach将其与fstream对象关联。然后您可以使用getline。试试boost库——我相信它有一个从文件创建流的功能* 或者您可以使用fileno从文件中获取标准的C文件句柄,然后使用fstream::attach将流附加到该文件。在那里,您可以使用getline等类似的工具:
FILE *condorData = _popen ("condor_q", "r");
std::ifstream &stream = new std::ifstream();
stream.attach(_fileno(condorData));
试试boost库——我相信它有一个从文件创建fstream的功能* 或者您可以使用fileno从文件中获取标准的C文件句柄,然后使用fstream::attach将流附加到该文件。在那里,您可以使用getline等类似的工具:
FILE *condorData = _popen ("condor_q", "r");
std::ifstream &stream = new std::ifstream();
stream.attach(_fileno(condorData));
我还没有完全测试过,但下面的内容似乎可以完成这项工作:
//! 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向量。我还没有对其进行很好的测试,但以下内容似乎可以完成这项工作:
//! 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向量。但请注意,向量不会像我认为OP预期的那样增长,但请注意,向量不会像我认为OP预期的那样增长