今日,写一个小系统时,因为结构体过长,欲用二进制一次性保存一个节点,结果在读取文件时却出现了一堆 屯,

这就很尴尬了。

左思右想,右思左想,百度完,去谷歌,谷歌完,又必应,必应问完贴吧问,贴吧问完CSDN问,

最后还是没有解决方案,这就很悲催了。

先放上部分源代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
typedef struct student
{int score;int num;char name[30];int _class;char major[30];char academy[30];char sex;int height;int weight;int birth_year;int birth_month;int birth_day;char birthplace[50];/*char home_place[50];char guardian[30];//监护人char tell;*/student *next;
}student;
void InitList(student *&L)
{L = (student *)malloc(sizeof(student));L->next = NULL;
}
void Add(student *&L)
{int ch;student *p, *q;q = L;p = (student *)malloc(sizeof(student));//插入,直接在新增节点时排序//学号,姓名,班级,专业,所在院系,性别,身高,体重,出生日期,籍贯printf("请输入姓名\n");scanf("%s", p->name);printf("请输入学号\n");scanf("%d", &p->num);printf("请输入素拓分\n");scanf("%d", &p->score);printf("%d\n", p->score);printf("请输入班级\n");scanf("%d", &p->_class);printf("请输入专业\n");scanf("%s", p->major);printf("请输入院系\n");scanf("%s", p->academy);rewind(stdin);printf("请输入性别(W或M)\n");scanf("%c", &p->sex);printf("请输入身高(cm)\n");scanf("%d", &p->height);printf("请输入体重(kg)\n");scanf("%d", &p->weight);printf("请输入出生日期(年)\n");scanf("%d", &p->birth_year);printf("请输入出生日期(月)\n");scanf("%d", &p->birth_month);printf("请输入出生日期(日)\n");scanf("%d", &p->birth_day);printf("请输入籍贯\n");scanf("%s", &p->birthplace);if (L->next == NULL){p->next = L->next;L->next = p;}else{while (q->next != NULL && p->score < q->next->score)q = q->next;p->next = q->next;q->next = p;}printf("是否继续添加?(Y/N)\n");ch = _getch();if (ch == 'Y' || ch == 'y')Add(L);
}
void Save(student *L)
{FILE *fp;student *p;if ((fp = fopen("信息.txt", "wb")) == NULL){printf("保存失败!\n");return;}for (p = L->next; p != NULL; p = p->next)fwrite(p,sizeof(student),1,fp);//fwrite()函数返回成功写入项的数量。正常情况下,该返回值就是 nmemb,但如果出现写入错误,返回值会比nmemb小。
 fclose(fp);
}
void Load(student *&L)
{//因为保存时,先保存大,再保存小,为了保持原有顺序,需要在读取时采用尾插法student *q;q = L;FILE *fp;if ((fp = fopen("信息.txt", "rb+")) == NULL){printf("读取失败!\n");return;}CNodeR(q, fp);printf("读取成功!\n");fclose(fp);
}
void CNodeR(student *&L, FILE *fp)
{student *p = (student *)malloc(sizeof(student));fread(p, sizeof(student), 1, fp);   p->next = L->next;L->next = p;if (!feof(fp))CNodeR(L, fp);
}

屯屯屯!!!输入法按 t 第一个都是屯了...

然后调试发现,保存过程没有什么问题,;读取时看起来也没有什么问题

可是!本应该读取完的数据还在继续读取!

于是想出一个快速解决方案

void Load(student *&L)
{//因为保存时,先保存大,再保存小,为了保持原有顺序,需要在读取时采用尾插法student *q;q = L;FILE *fp;if ((fp = fopen("信息.txt", "rb+")) == NULL){printf("读取失败!\n");return;}CNodeR(q, fp);printf("读取成功!\n");fclose(fp);Sleep(1000);
}
void CNodeR(student *&L, FILE *fp)
{student *p = (student *)malloc(sizeof(student));fread(p, sizeof(student), 1, fp);if (p->score < -1000){free(p);return;//这个判断是为了取消fread的副作用:多读一个节点
    }p->next = L->next;L->next = p;if (!feof(fp))CNodeR(L, fp);
}

问题解决。

结论,多观察调试。

转载于:https://www.cnblogs.com/luoshui/p/9402835.html

c语言链表fwrite二进制保存,读取时出现 屯 的问题相关推荐

  1. 【C语言】fwrite 写如0X0A时,自动添加0X0D的解决方法

    FILE *fp = fopen("1.txt","w+"); int j = 10; fwrite(&j,sizeof(unsigned int),1 ...

  2. python 文件保存读取时不用with的问题

    注释fw句子后:

  3. 图书管理系统 C语言链表实现 学校大作业功能齐全(书籍信息以及用户信息保存在附带的txt文件中)

    不废话直接附上源代码下载链接(一杯奶茶钱就能换一套图书管理系统哦~): C语言链表实现图书管理系统功能齐全(书籍信息以及用户信息保存在附带的txt文件中)-C文档类资源-CSDN文库 抱歉本人总是忘记 ...

  4. 求助c语言文件保存读取问题

    c语言文件保存读取问题 代码如下 void Save(Pointer Head) { Pointer p; FILE *fp; p=Head; for(i=0;p!=NULL;i++) { strcp ...

  5. python二进制方式读取文件,并将读取出的数据以txt的格式保存

    以二进制方式读取文件夹下所有二进制文件,将读取出的二进制数据转换为浮点数并以txt格式保存,代码如下: import os import struct import numpy as npdef re ...

  6. 有悔棋功能的五子棋c语言代码,有保存读取悔棋功能的五子棋.doc

    有保存读取悔棋功能的五子棋 制作拖动鼠标产生水纹动画的制作 1.导入一张合适的图片到库中 2.在库中刚导入的图片上点击右键.点击"链接",再按下图设置链接属性. 3.新建一个空影片 ...

  7. c语言链表成绩管理系统排序,【C项目】 文件,结构体,链表,排序, 学生信息管理系统...

    1.密码登录: 2.通过键盘输入学生信息,包括学生学号.姓名.成绩: 3.将输入的信息保存到指定文件中: 4.从文件中读取学生信息: 5.显示全部学生信息: 6.按学生总分进行降序排序: 7.删除学生 ...

  8. c语言链表写贪吃蛇思路,C语言构建的链表贪吃蛇

    用C语言链表写的贪吃蛇(程序设计时做的,做的不好大佬勿喷) 借助游戏内容分析贪吃蛇所需的功能主要包括这几块: 移动光标模块 打印地图模块和基本规则信息 读取最高分文件 打印初始蛇模块 打印时给予蛇的初 ...

  9. c语言ktv点歌系统链表,C语言链表实现歌手评分系统

    本文实例为大家分享了C语言链表实现歌手评分系统的具体代码,供大家参考,具体内容如下 此程序可以添加文件操作用于保存歌手得分等信息,此程序实现了链表的增删查和链表冒泡排序交换节点功能 #include ...

最新文章

  1. STM32 CAN 过滤器、滤波屏蔽器配置总结
  2. 高级系统项目管理师笔记1
  3. Python正则表达式尽可能小的匹配(遇到第一个结束字符串就停止匹配)
  4. python装饰器应用论文_Python装饰器的应用场景代码总结
  5. 漫画:什么是二分查找?
  6. 学习ESLint的规则配置,ESLint语法检测配置说明
  7. PHP的password_hash()使用实例
  8. Vue之动态组件(二)
  9. 从有理数到实数(序)
  10. SMBleed:Windows SMB 协议再被曝严重漏洞
  11. 线索二叉树是一种什么结构_技术面试之常用的数据结构
  12. quartz 2.0持久化到mysql_SpringBoot2.0整合Quartz定时任务(持久化到数据库,更为简单的方式)...
  13. Chromium OS编译手记
  14. Yii2基本概念之——事件(Event)
  15. MSVCRTD.lib重复定义问题
  16. ubuntu使用指南——root用户的设置、使用ssh远程登录、创建普通用户无法登录系统、远程重启或关闭服务器
  17. 【IRP】Windows 驱动之IRP
  18. kail里面的美杜莎和九头蛇的利用
  19. 用python解方程组
  20. latex 输入上极限和下极限

热门文章

  1. 联想小新14和air14的区别 哪个好
  2. 外网访问内网localhost web服务器
  3. 压缩减小图像大小技巧:8个最佳 JPEG 图像压缩软件
  4. 【蜂口 | AI人工智能】性别脸型分类——龙鹏 深度学习与人脸图像应用连载(四)
  5. 德尔格压缩空气检测仪分析压缩空气质量原理
  6. 【Linux网络编程】深入理解Linux五种网络IO模型
  7. 基于线性回归和TivaTM4C123GH6PM 微控制器的简易噪声计的设计
  8. sublime text配置fcitx输入法
  9. c语言认知报告,C语言认识实习报告.doc
  10. 6.4.1.4.1 General