替代fgets()?

时间:2009-03-02 16:54:21

标签: windows visual-c++

说明

  • 从可执行文件中获取输出

注意:

  • 由于fgets()声明
  • ,无法编译

问题:

  • 什么是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;
}

5 个答案:

答案 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_strdata方法都返回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向量。