2

代码:

#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. 我在这里做错了什么?

4

3 回答 3

4

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

于 2018-07-10T05:21:20.003 回答
4

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

由我大胆。

在更新模式 ('+') 下,可以执行输入和输出,但是如果没有对 fflush、fseek、fsetpos 或 rewind 的介入调用,则输出不能跟随输入,并且如果没有对 fseek 的介入调用,则输入不能跟随输出, fsetpos 或 rewind,除非输入操作遇到文件结尾。在更新模式下,即使指定了文本模式,也允许实现使用二进制模式。

于 2018-07-10T05:21:50.520 回答
3

您的代码中有多个问题:

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

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

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

  • fgets()在传递buff给之前,您不会测试 的返回值printf()。如果fgets()失败,这将具有未定义的行为,这在您的情况下会发生。

  • 您确实测试了 的返回值fopen(),但仍将潜在的 null 传递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;
}
于 2018-07-10T06:27:46.123 回答