首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fgetc逐行读取文件

fgetc逐行读取文件
EN

Stack Overflow用户
提问于 2012-08-21 22:12:47
回答 2查看 1.3K关注 0票数 0

因此,我正在开发一个函数,该函数将使用fgetc将一行读入缓冲区。因此,我可以随心所欲地使用该缓冲区,然后用下一行重新填充缓冲区。我的函数可以工作,但是我必须在for循环之外重复代码来处理最后一行,如下所示:

代码语言:javascript
复制
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*/

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

EN

回答 2

Stack Overflow用户

发布于 2012-08-21 22:20:50

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

此外,您的逻辑也很奇怪,因为您只在循环头部中检查EOF,而在循环中更新ch。这意味着在重新计算循环条件之前,它将通过ch == EOF运行。

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

代码语言:javascript
复制
for(i = 0, c = 1; (ch = fgetc()) != EOF; i++)

此外,您还需要考虑行分隔符,可能会出现'\n' (回车)和'\n' (换行符)。

票数 1
EN

Stack Overflow用户

发布于 2012-08-21 23:08:17

我不认为你应该在每个角色之后重新分配。如果您想让缓冲区达到所需的最小值,可以在最后使用( strlen() +1)进行重新分配;此外,还有一个函数fgets(),它读取一行。

代码语言:javascript
复制
#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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12056770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档