当前位置: 首页 > news >正文

fopen()函数以a+方式打开一个不存在的文件后读写出现问题

问题:在完成课后习题的时候,使用fopen()函数以"a+"方式打开一个不存在的文件时,写入、读取出现错误;
 1 //添加用户输入单词后,在单词头加入编号,确保编号跟着前面的开始排序
 2 #include "stdio.h"
 3 #include "stdlib.h"
 4 #define MAX 40
 5 
 6 int main(void){
 7     FILE *fp;
 8     char words[MAX];
 9     int count = 1,
10         temp;
11     
12     if((fp = fopen("words.txt", "a+")) == NULL){
13         fprintf(stderr, "打开文件\"words\"失败!\n");
14         exit(1);
15     }
16     
17     //从最后一个序号开始继续排序
18     fseek(fp, 0L, SEEK_SET);
19     while(1){
20         if(fscanf(fp, "%d", &temp) != 1)
21             break;
22         else
23             count++;
24     }
25     puts("输入单词添加到文件中:");
26     while(gets(words) != NULL && words[0] != '\0'){
27         fprintf(fp, "%d:%s", count++, words);
28     }
29     
30     puts("文件内容:");
31     while(fscanf(fp, "%s", words) == 1){
32         puts(words);
33     }
34     
35     if(fclose(fp) != 0){
36         fprintf(stderr, "关闭文件失败!\n");
37     }
38     
39     return 0;
40 }
问题代码

问题应该是出现在fopen()函数以"a+"的方式打开一个不存在的文件而导致的;

以下引用于"C语言中文网"(http://c.biancheng.net/cpp/html/250.html)

“a+"方式:以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符 不保留)。

正常来说代码上应该是没有问题的,因为"a+"方式打开文件可以对文件进行读写的操作,如果文件不存在则进行创建!

后面直接对文件先写入了内容,再运行程序后发现不会出现宕机的情况,但是鉴于程序的原来目的是要在文件不存在的情况下自动创建,那么这个问题我的解决办法是第一次打开文件的时候以"a"的方式打开,写入结束后关闭文件流指针,再重新以"r"的当时打开,避免了该情况的发生。

以上,若有问题希望大家可以指出来。

转载于:https://www.cnblogs.com/UncleXiang/p/5560797.html

相关文章:

  • 第五章
  • Android Studio自定义注释模板
  • 觉得很有用存一份
  • Grails用CONSOLE测试,比写集成测试还快
  • 186.Reverse Words in a String II
  • 用C#代码来安装、卸载、启动、关闭服务
  • 《java入门第一季》之TreeSet存储自定义对象并保证排序和唯一
  • 创建模仿存储库 Making a Mock Repository 精通ASP-NET-MVC-5-弗瑞曼 Listing 7-5
  • 《训练指南》——6.7
  • BadgeValueView
  • 64位win7下安装SQL Server 2008(图文解说版)
  • CSS3——让最后一行显示省略号
  • “前.NET Core时代”如何实现跨平台代码重用 ——程序集重用
  • 依赖注入框架:autofac
  • Educational Codeforces Round 13 E. Another Sith Tournament 状压dp
  • CentOS 7 修改主机名
  • LintCode 31. partitionArray 数组划分
  • Vue小说阅读器(仿追书神器)
  • 从零搭建Koa2 Server
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 前端面试题总结
  • 时间复杂度与空间复杂度分析
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一、python与pycharm的安装
  • No resource identifier found for attribute,RxJava之zip操作符
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1) caustics\
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转载)深入super,看Python如何解决钻石继承难题
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net和jar包windows服务部署
  • .NET企业级应用架构设计系列之技术选型
  • //解决validator验证插件多个name相同只验证第一的问题
  • ??myeclipse+tomcat
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @KafkaListener注解详解(一)| 常用参数详解
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [Codeforces] probabilities (R1600) Part.1
  • [CTF]2022美团CTF WEB WP
  • [C语言]——C语言常见概念(1)
  • [I2C]I2C通信协议详解(一) --- 什么是I2C
  • [IE9] IE9 Beta崩溃问题解决方案
  • [Jenkins] Docker 安装Jenkins及迁移流程
  • [leetcode] 103. 二叉树的锯齿形层次遍历
  • [Nuget]使用Nuget管理工具包
  • [SWPU2019]Web3
  • [笔记] Nios II基本函数整理