C 如何读取已查找的文件?

C 如何读取已查找的文件?,c,io,stream,fseek,C,Io,Stream,Fseek,我不知道这为什么不起作用: #include <stdio.h> int main(){ FILE* fp = fopen("txt2","wr"); if(!fp) return 1; fprintf(fp,"20"); fseek(fp,0,SEEK_SET); fprintf(fp,"19"); rewind(fp); ch

我不知道这为什么不起作用:

#include <stdio.h>

int main(){
    FILE* fp = fopen("txt2","wr");
    if(!fp) return 1;

    fprintf(fp,"20");
    fseek(fp,0,SEEK_SET);   
    fprintf(fp,"19");
    rewind(fp);
    
    char c;
    while((c=fgetc(fp))!=EOF)
        printf("%c",c);
}
但它编译起来没有问题。为什么呢?
wr
应为UB(从而导致segfault或其他错误)或?

模式
“wr”
对于POSIX或Microsoft无效字符串。您可能想使用
“w+”
。使用
“r+”
也是一种选择,但在打开文件之前,该文件必须存在

您正在使用的
fopen()
的实现可能将
“wr”
视为等同于
“w”
(除非它报告错误并且您的程序退出-最好报告退出的原因)。无法从只写文件流中读取

严格来说,您还应该对变量
c
使用
int
而不是
char
,因为模式
“wr”
对于POSIX或Microsoft无效。您可能想使用
“w+”
。使用
“r+”
也是一种选择,但在打开文件之前,该文件必须存在

您正在使用的
fopen()
的实现可能将
“wr”
视为等同于
“w”
(除非它报告错误并且您的程序退出-最好报告退出的原因)。无法从只写文件流中读取


严格来说,您还应该对变量
c
使用
int
而不是
char
,因为。

注意
fgetc()
返回
int
,而不是
char
。将
int
from
fgetc()
放入
char
值可以使
EOF
无法正确识别。即使使用
wr
作为flags@milanHrabos编译器不会检查模式字符串的内容以确定其是否有效。这取决于你。对于编译器来说,它只是一个字符串。请注意,
fgetc()
返回
int
,而不是
char
。将
int
from
fgetc()
放入
char
值可以使
EOF
无法正确识别。即使使用
wr
作为flags@milanHrabos编译器不会检查模式字符串的内容以确定其是否有效。这取决于你。对于编译器来说,它只是一个字符串。没有报告或错误,gcc在这里没有HEPPLE(所以它是UB)。无论如何,感谢这个解决方案可以是这个(将fopen中的标志更改为w+):
for(int c;(c=fgetc(fp))!=EOF;printf(“%c”,c))
报告错误的方法是返回
NULL
。测试
NULL
指针(这很好),但如果程序无法打开文件,则不会向用户写入消息。它只是通过
返回1以错误状态退出需要在命令行进行测试。您正在
main()
中使用C99或更高版本的语义-您没有最终的
返回0return 0
,因为main通常是最后一个运行的进程,后面没有其他进程(因此等待返回退出状态)。因此,我认为使用主体的退出状态对于最终<代码>返回0是多余的反对意见;代码>但是C标准委员会允许你省略它,只要你不使用C90(所以我不同意C标准委员会——我不认为这是一个好的改变,但它是部分地与C++兼容的,考虑不同)。没有报告或错误,GCC不在这里进行繁琐处理。(所以它是UB)。无论如何,感谢这个解决方案(在将fopen中的标志更改为w+之后):
for(int c;(c=fgetc(fp))!=EOF;printf(“%c”,c));
报告错误的方法是返回
NULL
。您可以测试
NULL
指针(这很好),但如果程序无法打开文件,则不会向用户写入消息。它只是通过
return 1;
退出,并显示错误状态,这需要在命令行进行测试。您在
main()中使用C99或更高版本的语义
-在main末尾没有最终的
返回0;
。是的,我没有在main末尾使用
返回0
,因为main通常是最后一个运行的进程,后面没有其他进程(因此等待返回退出状态)因此,我认为使用主退出状态对于最终的<代码>返回0是不一致的;,但是C标准委员会允许您省略省略它,只要您不使用C90。(所以我不同意C标准委员会——我认为这不是一个好的改变,但它是部分地与C++兼容的,在考虑方面是不同的)。
#include <stdio.h>
int main(){
    FILE *fp = fopen("txt","wr");
    if(!fp){
        printf("nada\n");
        return 1;
    }
}