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()
- 您确实测试了
的返回值,但仍然会调用未定义的行为,将可能为null的fopen()
传递给其他流函数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;
}