0

所以我正在研究一个用于将fgetc一行读入缓冲区的函数。所以我可以随意使用该缓冲区,然后用下一行重新填充缓冲区。我的函数有效,但是我必须在 for 循环之外重复代码来处理最后一行,如下所示:

for(i = 0, c = 1; ch != EOF; i++)
{
    ch = fgetc(grab);
    if(ch == 0x0A)
    {
        /*Process Line*/
        c = 1;
    }
    else 
    {
        linetmp = realloc(line, (c + 1) * sizeof(char));
        if(!linetmp)
        {
            free(line);
            free(url);
            printf("\nError! Memory allocation failed!");
            return 1;
        }
        line = linetmp;
        line[c - 1] = ch;
        line[c] = 0x00;
        c++;
    }
}
/*repeat if(ch == 0x0A) statement*/

我宁愿在同一个循环中完成这一切,但不确定我将如何去做。任何帮助将不胜感激!

4

2 回答 2

1

getline()如果您在 POSIX 系统上,我建议您改为使用。

此外,您的逻辑很奇怪,因为您EOF仅在循环头中检查,但ch在循环内更新。这意味着它将ch == EOF在重新评估循环条件之前运行 with 。

您应该尝试将更新和检查放在一起,使循环标题如下所示:

for(i = 0, c = 1; (ch = fgetc()) != EOF; i++)

此外,您需要考虑行分隔符,'\n'(回车)和'\n'(换行)都可能发生。

于 2012-08-21T14:20:50.133 回答
0

我认为您不应该在每个字符之后重新分配。如果您想让缓冲区处于所需的最小值,您可以在最后重新分配 (strlen() + 1); 此外,还有一个函数 fgets() 可以读取一行。

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


int somefunc(FILE *grab)
{
   int current_size = 100;
   int data_size = current_size - 1;
   char *url = malloc(current_size);
   char *line = malloc(current_size);
   char *linetmp;
   int ch;
   ch = fgetc(grab);
   int i = 0;
   int c  = 0;
   while (ch  != EOF && ch != 0x0A )
   {
      i++;
      if ( i > data_size )
      {
         current_size = current_size * 2;
         data_size = current_size - 1;
         linetmp = realloc(line, current_size);
         if (!linetmp)
         {
            free(line);
            free(url);
            printf("\nError! Memory allocation failed!");
            return 1;
         }
         line = linetmp;
      }
      line[c] = ch;
      c++;
      ch = fgetc(grab);
   }
   line[c] = '\0';
   linetmp = realloc(line,strlen(line) + 1);
   line = linetmp;
   printf("we just read line->%s\n",line);
   free(line);
   free(url);
   return 0;
}


int main(void)
{
   char *cpFilename = "somefile.txt";
   FILE *fp = fopen(cpFilename,"r");
   if ( fp == NULL )
   {
      printf("ERROR: could not open %s\n",cpFilename);
      printf("Error code: %d\n",errno);
      perror("ERROR:");
      return 1;
   }
   int return_code = somefunc(fp);
   while (return_code != EOF && return_code != 1)
   {
      return_code = somefunc(fp);
   }
   fclose(fp);
}
于 2012-08-21T15:08:16.920 回答