所以我正在开发一个函数,它将使用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*/
我宁愿在同一个循环中完成所有操作,但我不确定如何进行此操作。任何帮助将不胜感激!
答案 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);
}