c - C - 创建文件时使用“w+”模式
问题描述
我正在尝试创建一个文件,写入其中,然后读取它并打印出读取的内容。我正在尝试使用 w+ 模式,但输出给出了无限的空行。我究竟做错了什么?
int main() {
FILE *fPointer;
char line[10];
fPointer = fopen("newFile.txt","w+");
fprintf(fPointer, "Hello\nWorld\n!");
while (!feof(fPointer)) {
fgets(line, 10, fPointer);
puts(line);
}
fclose(fPointer);
return 0;
}
解决方案
您违反了 7.21.5.3 The fopen function , C 标准的第 7 段:
当以更新模式打开文件时(“+”作为上述模式参数值列表中的第二个或第三个字符),可以在关联的流上执行输入和输出。但是,如果没有对 fflush 函数或文件定位函数(fseek、fsetpos 或 rewind)的干预调用,则输出不应直接跟随输入,并且在没有对文件定位的干预调用的情况下,输入不应直接跟随输出函数,除非输入操作遇到文件结尾。
这可能解释了为什么while (!feof(fPointer))
循环不会终止。尽管您的用法不正确,但它通常会终止。通过忽略来自fgets()
(在所有其他被忽略的返回值中)的返回值,您可能会错过返回的错误。
由于您没有提供有关您的实施的任何细节,因此外部观察者不可能确定地知道。
推荐阅读
- python - (Python) pandas.DataFrame 不会在每个 for-loop 循环中更新值,为什么?
- python - 如何从当前工作目录读取 csv 文件?
- python - Selenium 代码在 MCQ 的选项选择中运行缓慢
- laravel - 生产中缺少必需的参数错误,但在本地工作
- angular - 使用 AngularFire 中的 SnapshotChanges 映射对象中的文档引用
- performance - Julia 性能提升建议
- android - 通过 Fragment 调用 mainActivity 方法
- java - Twilio verify.v2 无法使用 API 验证新电话号码
- sparql - 是否可以使用 if 语句来确定在 SPARQL 的 where 子句中使用哪种图形模式?
- uwp - uwp xaml 以声明方式定义默认具有焦点的控件