【问题标题】:Newline, EOF and feof() aren't acknowledged不承认换行、EOF 和 feof()
【发布时间】:2013-08-16 16:32:18
【问题描述】:

我有一个执行以下操作的函数:

ssize_t headache(char **lineptr, size_t *n, FILE * stream)
{
    if(lineptr != NULL)
    {
            free(*lineptr);
    }
    size_t  len     = 0,
            last    = 0;
    char *  buf     = NULL;
    int c;

    do
    { 
            last = len;
            ++len;
            buf = realloc(buf,len);
            c = fgetc(stream);
            buf[last] = (char)c;
            printf("%i\t%x\t%c\n", last, buf[last], buf[last]);
    }
    while(!feof(stream) || c != '\n');
    *n = strlen(buf);
    *lineptr = buf;
    return len;
}

头痛总是被称为头痛(&lineptr,&n,stream)

char * lineptr = NULL;
size_t n = 0;
FILE * stream;

do{}while();循环永远不会确认换行符或 EOF,这意味着它将无限继续。我不明白为什么它忽略 EOF 和 '\n'。谁能告诉我我做错了什么?

【问题讨论】:

    标签: c newline eof fgetc


    【解决方案1】:
    while(!feof(stream) || c != '\n');
    

    将再次循环,除非两个条件都为 false。当您收到EOF\n 时,您想退出循环,所以应该改用&&

    while(!feof(stream) && c != '\n');
    

    【讨论】:

    • 我以为 ||这意味着如果满足任何一个条件,循环将退出。
    • 这确实有点用。但现在它一遍又一遍地从流中读取第一行。
    • 快速修改调用这个函数的 main() 让我意识到它被错误地实现了。做了一点改变,它的工作原理!非常感谢!
    • 很高兴听到您成功了。关于您的第一条评论,|| 是逻辑 OR 运算符,除非其两个操作数均为 0(假),否则计算结果为 true
    【解决方案2】:

    你的问题是

    while(!feof(stream) || c != '\n')

    这是因为使用 || (或)您必须使两个条件都为假才能停止执行。有些输入会使您的 while 循环永远不会结束。 this is a test inputthis is a test input\n.

    如果您将其作为file* 的标准输入运行,则比较当您运行它时会发生什么,您输入一条消息并按 Enter,然后输入一条消息并按 control-d(在终端中是 EOF)

    正如 simonc 所说,您需要 && 运算符,它只需要条件之一为 false 即可停止。

    【讨论】:

    • 这不是标准输入。它通常有 stream = fopen(argv[1],"r");
    • 您可以尝试在您选择的编辑器中打开文件(对我来说是 VIM),看看它是否可以列出隐藏的字符(在 vim 中它的 :list),如果有的话,至少会显示文件末尾的 \n。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2021-04-18
    相关资源
    最近更新 更多