fgetc逐行读取文件

时间:2012-08-21 14:12:47

标签: c file fgetc

所以我正在开发一个函数,它将使用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*/

我宁愿在同一个循环中完成所有操作,但我不确定如何进行此操作。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

如果您使用的是POSIX系统,我建议您使用getline()

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

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

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

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

答案 1 :(得分: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);
}