因此,我正在开发一个函数,该函数将使用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*/我宁愿在同一个循环中做这一切,但不确定我将如何做这件事。任何帮助都将不胜感激!
发布于 2012-08-21 22:20:50
如果您使用的是POSIX系统,我建议您改用getline()。
此外,您的逻辑也很奇怪,因为您只在循环头部中检查EOF,而在循环中更新ch。这意味着在重新计算循环条件之前,它将通过ch == EOF运行。
您应该尝试将更新和检查放在一起,使循环标头如下所示:
for(i = 0, c = 1; (ch = fgetc()) != EOF; i++)此外,您还需要考虑行分隔符,可能会出现'\n' (回车)和'\n' (换行符)。
发布于 2012-08-21 23:08:17
我不认为你应该在每个角色之后重新分配。如果您想让缓冲区达到所需的最小值,可以在最后使用( 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);
}https://stackoverflow.com/questions/12056770
复制相似问题