我已编写此代码以获取用户的输入并将其另存为文本文件。
int main(){
FILE *fp;
fp = fopen("rahiv.txt", "w");
char s[80];
char a;
gets(s);
a = s ;
fputs(s, fp);
}
但是如果我想编写下面的fput部分,它会给我分段错误,我怎样才能转换gets()函数的返回值并修复它!
int main(){
FILE *fp;
fp = fopen("rahiv.txt", "w");
char s[80];
fputs(gets(s), fp);
}
答案 0 :(得分:2)
这是一些不安全的代码。我会尝试按顺序解决问题,并希望在此过程中的某个地方回答您的问题。
1)您需要确保文件已成功打开。这不像Java / C#/ Python /其他高级语言那样会引发异常。您必须检查if(fp == NULL) { /*handle error*/ }
2)您试图将变量等同于a
和s
,它们是不同的类型,而不是等效的。 char s[80]
在堆栈上分配一个80字节长的字符数组。看起来s
类型为char
,但实际上类型为char*
,所以行a = s
......好吧,我不确定它是做什么的。
3)gets
可以返回的不仅仅是字符串。 From the docs
成功时,该函数返回str。 如果文件结尾是 在尝试读取字符时遇到,eof指示符是 设(feof)。如果在任何字符被读取之前发生这种情况,那么 返回的指针是一个空指针(并且str的内容保留 不变)。如果发生读取错误,则错误指示符(ferror)为 设置并返回一个空指针(但指向的内容 str可能已经改变了。)
尝试将返回值直接传递到fputs
可能会工作,如果你很幸运,一切都是正确的,但如果有错误,它会爆炸。在更高级别的语言中,有很多诱惑将方法的结果直接传递给另一个方法的参数,但是在C中,由于没有try / catch,因此通常会很糟糕地结束,因此错误通常会作为特殊情况返回返回值。不要试图使它更紧凑,更喜欢更长的代码,并将所有正确的测试用例放入错误中!
4)你永远不会关闭文件。请务必调用fclose(fp);
,否则如果程序崩溃,您将导致内存泄漏,并可能导致一些不良行为,从而导致您编写的数据丢失。