/* 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
}
答案 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;