C w+;尝试读取文件内容时不工作

C w+;尝试读取文件内容时不工作,c,fgets,fputs,C,Fgets,Fputs,代码: #包括 void main(){ 文件*ptr; 字符buff[255]; ptr=fopen(“Test.txt”,“w+”); 如果(ptr!=NULL){ printf(“成功”\n); } fputs(“你好”,ptr); fgets(buff,255,(文件*)ptr); printf(“%s”,浅黄色); fclose(ptr); } 当我打开文件“Text.txt”时,它的内容是“Hello”,但我无法用fgets打印出来。我做错了什么?您在阅读之前没有倒带文件fseek

代码:

#包括
void main(){
文件*ptr;
字符buff[255];
ptr=fopen(“Test.txt”,“w+”);
如果(ptr!=NULL){
printf(“成功”\n);
}
fputs(“你好”,ptr);
fgets(buff,255,(文件*)ptr);
printf(“%s”,浅黄色);
fclose(ptr);
}

当我打开文件“Text.txt”时,它的内容是“Hello”,但我无法用
fgets
打印出来。我做错了什么?

您在阅读之前没有倒带文件<代码>fseek(ptr,0,SEEK_SET)或<代码>倒带(ptr)

读取,例如

我很大胆

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


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

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

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

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

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

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

以下是更正的版本:

#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);
}
#包括
内部主(空){
文件*ptr;
字符buff[255];
ptr=fopen(“Test.txt”,“w+”);
如果(ptr==NULL){
printf(“无法打开Test.txt\n”);
返回1;
}
printf(“成功”\n);
fputs(“你好”,ptr);
倒带(ptr);
if(fgets(buff、sizeof buff、ptr)){
printf(“%s”,浅黄色);
}否则{
printf(“无法从流读取\n”);
}
fclose(ptr);
返回0;
}

无需将
ptr
(a
文件*
)转换为
文件*
。好的,谢谢您的提示@Ry注释。只有在Windows上才可以
void main(void)
@chqrlie为什么我要
intmain(void)
尽管如此?我在使用
void main()
时从来没有遇到过问题。我还看到人们在出现错误时喜欢
返回1
,这是正常的吗?@chrqlie同样,您使用了
sizeof buff
,它的意思是否与
255
相同?如果它是
int buff[255]
,我还能使用
sizeof buff
?而
sizeof
是否需要括号
()
?@WealthyPlayer:
sizeof buff
在编译时计算为
255
,因为
buff
字符的数组,因此,它是相同的,只是如果以后决定更改
buff
定义中的大小,则使用不会失去同步的表达式更安全。如果
buff
是一个
int
数组,那么
sizeof buff
将是
255*sizeof(int)
,但是将
int
数组传递给
fgets()
是不正确的。数组
a
的元素数可以(在编译时)计算为
sizeof(a)/sizeof(*a)
@WealthyPlayer:
sizeof
在应用于
sizeof(int)
中的类型时需要括号,它们对于变量和表达式参数是可选的,
sizeof
就是另一个前缀操作符,比如
~
。有些人喜欢总是把论点放在括号里,以保持一致性和可读性。Linux Torvalds是出了名的肛门。如果
sizeof
是一个较大表达式的一部分,例如
sizeof(*p)*10
,我个人会使用括号,我发现它比
sizeof*p*10
更清晰。
#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;
}