c-奇怪的fgets()行为

c-奇怪的fgets()行为,c,file,C,File,我编写的以下代码应该是打开一个作为输入的文件,对其进行写入和读取 fopen()工作正常,我可以访问该文件 fprintf()也按预期工作 但是对于fgets,如果我使用如图所示的if命令,则条件为true, 如果我没有得到输入[0]是'\n'字符,而输入[1]是'h',循环运行时不会停止,因为fgets()会一次又一次地读取第一个字符 此外,fgets()似乎没有前进,并已将所有文件读取到输入中-我可以按预期打印输入[3]并获取“l”,尽管fgets()被命令只读取2个字符 int mai

我编写的以下代码应该是打开一个作为输入的文件,对其进行写入和读取

  • fopen()工作正常,我可以访问该文件
  • fprintf()也按预期工作
但是对于fgets,如果我使用如图所示的if命令,则条件为true, 如果我没有得到输入[0]是'\n'字符,而输入[1]是'h',循环运行时不会停止,因为fgets()会一次又一次地读取第一个字符

此外,fgets()似乎没有前进,并已将所有文件读取到输入中-我可以按预期打印输入[3]并获取“l”,尽管fgets()被命令只读取2个字符

int main(int argc, char *argv[])
{
    FILE* read = NULL;
    read = fopen(name, "a+");

    char* input = "";

    fprintf(read, "hello world\n");
    fprintf(read, "hello world\n");

    assert(ferror(read) == 0);

    while(!feof(read))
    {
        if(fgets(input, 2, read)==NULL)
            return 0;
        printf("%c\n", input[1]);


    }
return 0;
}
printf(“%c\n”,输入[1])将始终打印nul char

手册页是您的朋友

fgets()从流中读取的字符数最多比大小字符少一个,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止。如果新行被读取,它将被存储到缓冲区中。终止空字节(aq\0aq)存储在缓冲区中最后一个字符之后

这使得
input
指向一个字符串常量,特别是一个空字符串

    if(fgets(input, 2, read)==NULL)
这将尝试修改
输入
指向的内容。由于
input
指向字符串常量,因此会尝试修改字符串常量。但是,根据定义,你不能修改一个常量——这就是为什么它是常量。

char*input=“”。这使得
input
指向字符串文本。无法修改字符串文字。因此,您的程序具有未定义的行为。您需要为
输入分配一个内存缓冲区。此外,如果您想读回刚刚编写的内容,则在执行
fprintf
之后,需要
回放文件指针。最后,请看。
    if(fgets(input, 2, read)==NULL)