使用单独的fgets(嵌套fgets)抓取下一行

时间:2014-04-17 19:56:33

标签: c fgets

这可能是一个非常愚蠢的问题(可能),但我正在使用fgets处理文本文件。没什么太花哨的:

while (fgets(buf, sizeof(buf), inputFile) != NULL)

这很有效,正如您所期望的那样。那么我的问题是,我的处理依赖于文件中的 next 行,但是我如何才能抓住下一行?

我发现它很棘手的原因是我仍然需要在fgets继续循环时单独处理下一行,但是当我在该行之前一行时,我的函数需要知道某个值是否出现在它之后的一行。

基本上,我不知道是否有办法在 fgets中执行其他fgets ,但是从当前位置开始?我怀疑没有,但我不确定如何实现它,因为当我仍然试图处理当前行时我不想跳到下一行,因为我在某些输入值sscanf并且我不想要覆盖它们。

如果没有意义,我会尽力澄清,但任何想法都会受到赞赏!

2 个答案:

答案 0 :(得分:0)

您可以使用容量二的循环队列。用两行初始化队列。伪代码可能看起来像这样。

CircularQueue cq = CircularQueue(first_line, second_line);
while(true) {
   if (check(cq[SECOND_ELEMENT])) {
       process(cq[FIRST_ELEMENT]);
       remove(cq[FIRST_ELEMENT])
       append(cq, fgets(buf, sizeof(buf), inputFile))
   } else {
       break;
   }
}

当然,因为我们已经知道我们想要一次处理两个元素,我们可以将指针保持为previous_element& current_element。 previous_element将指向您已读取的第二行,current_element将指向您已阅读的最后一行。

答案 1 :(得分:0)

我会做以下事情:

#include <stdio.h>
#include <stdlib.h>

char *getdata(char **buf, char **nextBuf, int bufsize, FILE *inFile )
{
   char *ret;
   static char *cBuf = NULL;
   static char *nBuf = NULL;
   static char *nRet = NULL;
   static int bSize = 0;

   if( cBuf ==NULL && nBuf==NULL && bufsize !=0 ) {
      if( bufsize != 0 ) {
         // allocate buffers and init them with first two lines of load.
         bSize = bufsize;
         cBuf = malloc( bSize );
         nBuf = malloc( bSize );
         if ( cBuf && nBuf ) {
            if( (ret = fgets(cBuf, bSize, inFile)) != NULL ) {   
               *buf = cBuf;
               // get next line ahead of time the first time we are called.
               nRet = fgets(nBuf, bSize, inFile);
               *nextBuf = (nRet==NULL)? NULL : nBuf;          
            }
         }
      }
      else {
        ret = NULL;
      }
   }
   else if( cBuf==NULL && nBuf==NULL && bufsize == 0 ) {
      // shutdown, cleanup
      free( cBuf ); cBuf = NULL;
      free( nBuf ); nBuf = NULL;
      bSize = 0;
      *buf = NULL;
      *nextBuf = NULL;
      ret = nRet = NULL;
   }
   else {
      // set current line to the previously fetched next line
      if( nRet ) {
         char *tmp;
         // swap buffers
         tmp = cBuf; 
         cBuf = nBuf;
         nBuf = tmp;
         *buf = cBuf;
         ret = nRet;
         // now get the NEW next line
         nRet = fgets(nBuf, bSize, inFile);
         *nextBuf = (nRet==NULL)? NULL : nBuf;          
      }
      else {
        ret = nRet;
      }
   }
   return ret;
}


int main(void)
{
   char *buf = NULL;
   char *nbuf = NULL;
   while( getdata( &buf, &nbuf, 2048, stdin ) != NULL ) {
       // process line.  if needed, next line, if available is in nbuf 
       // (nbuf can be ptr to NULL if next line not present, be careful.)
       printf( "%s", buf );
   }
   getdata( NULL, NULL, 0, NULL);
}