在读取未知线长的文件时确定EOF

时间:2016-09-08 21:51:52

标签: c file file-io io

/* Utility function to read lines of unknown lengths */
char *readline(FILE* fp, int max_length)
{
    //The size is extended by the input with the value of the provisional
    char *str;
    int ch;
    int len = 0;
    int current_max = max_length;

    str = (char*)malloc(sizeof(char)*current_max);
    if(!str)
        return str;

    while((char)(ch = fgetc(fp))!='\n' && ch != EOF)
    {
        str[len++] = ch;
        if(len == current_max)
        {
            current_max = current_max + max_length;
            str = realloc(str, sizeof(char)*current_max);
            if(!str)
                return str;
        }
    }
    str[len] = '\0';

    return str;
}

我有上面的代码片段来读取未知长度的行。我能够读取单行输入,正如stdin所期望的那样,但在读取文件时,我无法确定文件的EOF。

从文件中读取时,我在循环中逐行读取它,现在我想在读取所有行后断开循环但是我无法确定何时这样做,因此循环结束永远执行。请帮我确定休息状况。

char *line;

while(1)
{
    line = readline(fd, MAX_INPUT_LENGTH);

    /*IF all lines have been read then break off the loop, basically determine EOF ?*

    //text processing on the line

}

4 个答案:

答案 0 :(得分:0)

尝试:

while((ch = fgetc(fp))!=EOF)
{
    str[len++] = ch;
    if (ch=='\n')
        break;
}
str[len]= '\0';
return(str);

这将EOL处理与EOF处理分开。读完EOF后,下一次读取readline将返回一个空字符串,即已达到EOF的信号。

答案 1 :(得分:0)

你应该这样改变代码:

old_path = $location.path()
path = old_path.replace(/.(?=.{4,}$)/g, '#');

答案 2 :(得分:0)

处理此问题的最佳方法是让php locations-test.php 为EOF [或错误]返回NULL。但是,您还必须考虑空白行。

我已将您的代码更改并注释为我认为可行的内容。由于readline的执行方式发生了变化,max_length并非如此有用[请原谅无偿的风格清理]:

realloc

答案 3 :(得分:0)

建议测试为什么循环停止。

为简洁起见,省略了内存管理。

while((ch = fgetc(fp)) != '\n' && ch != EOF) {
  str[len++] = ch;
}

// If _nothing_ read, return NULL
if (len == 0 && ch == EOF) {
  return NULL;
}

str[len]= '\0';
return str;