【问题标题】:c - weird fgets() behaviorc - 奇怪的 fgets() 行为
【发布时间】:2016-07-15 03:30:33
【问题描述】:

我编写的以下代码应该打开一个作为输入的文件,写入并读取。

  • fopen() 工作正常,我可以访问该文件。
  • fprintf() 也可以正常工作。

但至于 fgets - 如果我使用 if 命令,如图所示,条件为真, 如果我没有得到那个 input[0] 是 '\n' 字符,而 input[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;
}

【问题讨论】:

  • char* input = "";。这使得 input 指向一个字符串文字。不能修改字符串文字。所以你的程序有未定义的行为。您需要为input 分配一个内存缓冲区。此外,在fprintf 之后,如果你想读回你刚刚写的内容,你需要rewind 文件指针。最后,请参阅Why is “while ( !feof (file) )” always wrong?

标签: c file


【解决方案1】:
char* input = "";

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

    if(fgets(input, 2, read)==NULL)

这会尝试修改input 指向的内容。因为input 指向一个字符串常量,所以它试图修改一个字符串常量。但是,根据定义,您不能修改常量——这就是使其成为常量的原因。

【讨论】:

    【解决方案2】:

    printf("%c\n", input[1]); 将始终打印 nul char

    手册页是你的朋友。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多