Windows 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",

说明:

从可执行文件获取输出 注:

由于fgets声明,将不会编译 问题:

由于fgets需要字符*,fgets的最佳替代方案是什么? 有更好的选择吗? 说明:


您应该对字符串使用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预期的那样增长