w+ 尝试读取文件内容时不起作用

w+ not working when trying to read file content

代码:

#include <stdio.h>

void main() {
    FILE *ptr;
    char buff[255];
    ptr = fopen("Test.txt", "w+");

    if (ptr != NULL) {
        printf("Success\n");
    }

    fputs("Hello", ptr);

    fgets(buff, 255, (FILE *)ptr);
    printf("%s", buff);
    fclose(ptr);
}

文件"Text.txt"打开的时候内容是"Hello",但是用fgets就是打印不出来。我这里做错了什么?

您在阅读前没有倒回文件。 fseek(ptr, 0, SEEK_SET);rewind(ptr);

阅读,例如https://en.cppreference.com/w/c/io/fopen

由我大胆

In update mode ('+'), both input and output may be performed, but output cannot be followed by input without an intervening call to fflush, fseek, fsetpos or rewind, and input cannot be followed by output without an intervening call to fseek, fsetpos or rewind, unless the input operation encountered end of file. In update mode, implementations are permitted to use binary mode even when text mode is specified.

您的代码中存在多个问题:

  • 您必须发出对 fseek()fsetpos()rewind() 的调用以在流的写入和读取之间切换,反之亦然。

  • 没有参数的 main 的原型是 int main(void).

  • 不需要在fgets(buff, 255, (FILE *)ptr);中施放ptr。无用的转换可以隐藏类型不匹配和其他类似的错误。

  • 在将 buff 传递给 printf() 之前,您没有测试 fgets() 的 return 值。如果 fgets() 失败,这有未定义的行为,在你的情况下它确实如此。

  • 您确实测试了 fopen() 的 return 值,但仍然将可能为空的 ptr 传递给其他流函数,调用未定义的行为。

这是更正后的版本:

#include <stdio.h>

int main(void) {
    FILE *ptr;
    char buff[255];

    ptr = fopen("Test.txt", "w+");
    if (ptr == NULL) {
        printf("Cannot open Test.txt\n");
        return 1;
    }
    printf("Success\n");

    fputs("Hello", ptr);
    rewind(ptr);
    if (fgets(buff, sizeof buff, ptr)) {
        printf("%s", buff);
    } else {
        printf("Cannot read from stream\n");
    }
    fclose(ptr);
    return 0;
}