c - 解析文本文件的简单方法?

标签 c string parsing text

我正在制作一个负载均衡器(一个非常简单的)。它查看用户空闲的时间以及系统上的负载,以确定进程是否可以运行,并以循环方式遍历进程。

控制流程所需的所有数据都存储在文本文件中。 该文件可能如下所示:

 PID=4390 IDLE=0.000000 BUSY=2.000000 USER=2.000000
 PID=4397 IDLE=3.000000 BUSY=1.500000 USER=4.000000
 PID=4405 IDLE=0.000000 BUSY=2.000000 USER=2.000000
 PID=4412 IDLE=0.000000 BUSY=2.000000 USER=2.000000
 PID=4420 IDLE=3.000000 BUSY=1.500000 USER=4.000000

这是一项大学作业,但是解析文本文件不应该是其中的重要部分,这意味着我可以使用对我来说最快实现的任何方式。

此文件中的条目将随着流程完成或在控制下添加而添加和删除。

关于如何解析这个有什么想法吗?

谢谢。

最佳答案

下面的代码将解析您的文件,并考虑到您的文件可能不可用(即 fopen 可能会失败),或者在您读取文件时被写入(即也就是说,fscanf 可能会失败)。请注意,您可能不想使用无限循环(与要在项目中复制粘贴的实际代码相比,伪代码更多,我没有尝试运行它)。另请注意,考虑到那里的 sleep 持续时间,它可能会相当慢:您可能想要使用更高级的方法,这更像是一种黑客攻击。

int pid;
float idle, busy, user;

FILE* fid;
fpos_t pos;
int pos_init = 0;

while (1)
{
  // try to open the file
  if ((fid = fopen("myfile.txt","rw+")) == NULL)
  {
     sleep(1); // sleep for a little while, and try again
     continue; 
  }

  // reset position in file (if initialized)
  if (pos_init)
     fsetpos (pFile,&pos);

  // read as many line as you can
  while (!feof(fid))
  {
     if (fscanf(fid,"PID=%d IDLE=%f BUSY=%f USER=%f",&pid, &idle, &busy, &user))
     {
        // found a line that does match this pattern: try again later, the file might be currently written
        break;
     }

     // add here your code processing data         

     fgetpos (pFile,&pos); // remember current position
     pos_init = 1; // position has been initialized
  }

  fclose(fid);
}

关于c - 解析文本文件的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5211028/

相关文章:

c - 单个列表打印错误

c - 使用 LLVM 按参数传递结构

PHP 字符串数字连接搞砸了

c# - 比较两个不同顺序的字符串

java - 什么样的内存分配给大小为零的数组对象?

c - 随机函数中的枚举

c++ - 如何在C语言中检测环绕计数器和大负值之间的区别

python - 我将如何解析以下日志?

parsing - 递归地使用 Antlr4 解析器和监听器

ruby-on-rails - Ruby 解析 : Error when I trying to put Cyrillic symbols into URL request