C/C++语言之由数字26引起的文件的数据保存与读取调试。
首先在VS2010中遇到的问题是,建立了一个结构体
struct position{
int x;
int y;
};
然后用此结构体声明一个数组rout[8];
for(int i=0;i<8;i++)
rout[i]=i+25;
然后把结构体数据存储到文件中
fwrite(&rout[i],sizeof(position),1,fp);
从文件中直接观察到的字节数为sizeof(position)*8,但是读取数据时
fread(temp,sizeof(position),1,fp);
并不能读取到文件的结尾处就结束。
后来发现是读取到rout[i].x=26时就结束。
问题1,读到这个26就结束的原因是什么?
在验证过程中,有以下代码
#include"Stdafx.h"
#include<iostream>
#include"atlstr.h"
using namespace std;
int rout[10];
void main()
{
int t=0;
int temp;
for(int i=0;i<10;i++)
rout[i]=i+25;
FILE *fp=fopen("rout_list13.txt","w");
for(int i=0;i<10;i++)
fwrite(&rout[i],sizeof(int),1,fp);
fclose(fp);
fp=fopen("rout_list13.txt","r");
while(t<10)
{
fread(&temp,sizeof(int),1,fp);
printf("%d",temp);
t++;
}
fclose(fp);
}
发现输出的结果一直是

问题2:问什么会出现值不变的情况?
对以上代码做以下更改
#include"Stdafx.h"
#include<iostream>
#include"atlstr.h"
using namespace std;
int rout[10];
void main()
{
int t=0;
int temp;
for(int i=0;i<10;i++)
rout[i]=i+6;
FILE *fp=fopen("rout_list13.txt","w");
for(int i=0;i<10;i++)
fwrite(&rout[i],sizeof(int),1,fp);
fclose(fp);
fp=fopen("rout_list13.txt","r");
while(t<10)
{
fread(&temp,sizeof(int),1,fp);
printf("%d",temp);
fread(&temp,sizeof(int),1,fp);
printf("%d",temp);
t++;
}
fclose(fp);
}
可以看到出现这样的结果

首先分析数组存在10个数从6到15结束,但是读取了20次,当读取到结尾处时数据一直不变。
#include"Stdafx.h"
#include<iostream>
#include"atlstr.h"
using namespace std;
int rout[10];
void main()
{
int t=0;
int temp;
for(int i=0;i<10;i++)
rout[i]=i+20;
FILE *fp=fopen("rout_list13.txt","w");
for(int i=0;i<10;i++)
fwrite(&rout[i],sizeof(int),1,fp);
fclose(fp);
fp=fopen("rout_list13.txt","r");
while(t<10)
{
fread(&temp,sizeof(int),1,fp);
printf("%d",temp);
fread(&temp,sizeof(int),1,fp);
printf("%d",temp);
t++;
}
fclose(fp);
}
结果是

所以由以上的调试过程可以得到以下结论:当文件数据读取结束后,在对文件进行读取时值为最后读取的结果并保持不变,可以回答问题2.
继续讨论问题1,通过用fseek函数进行定位,发现26这一个数在文件中占用4个字节的数据。
后面百度了一下26的文件读取问题,得到了解决的方法。
在向文件中写或读数据时用二进制进行表示。代码如下
#include"Stdafx.h"
#include<iostream>
#include"atlstr.h"
using namespace std;
int rout[10];
void main()
{
int t=0;
int temp;
for(int i=0;i<10;i++)
rout[i]=i+24;
FILE *fp=fopen("rout_list13.txt","wb");
for(int i=0;i<10;i++)
fwrite(&rout[i],sizeof(int),1,fp);
fclose(fp);
fp=fopen("rout_list13.txt","rb");
while(t<5)
{
fread(&temp,4,1,fp);
printf("%d",temp);
t++;
}
fclose(fp);
}
结果为

问题1也得到了解决。
C/C++语言之由数字26引起的文件的数据保存与读取调试。的更多相关文章
- C语言-1.static 和 extern使用,2.文件,3.数据块读写
1.static 和 extern使用, 1)修饰局部变量 static修饰局部变量特点:延长局部变量的生命周期 ,static修饰的局部变量只会被执行一次 extern不能修饰局部变量 2)修饰全局 ...
- C.【转】C语言字符串与数字相互转换
1.gcvt 把浮点数转成字符串 - CSDN博客.html(https://blog.csdn.net/dxuehui/article/details/52791412) 1.1. 函数名: gcv ...
- Swift语言指南(五)--数字字面量和数字类型转换
原文:Swift语言指南(五)--数字字面量和数字类型转换 数字字面量 整数字面量写法如下: · 十进制数,无前缀 · 二进制数,以 0b 为前缀 · 八进制数,以 0o 为前缀 · 十六进制数,以 ...
- C 语言实例 - 判断数字为几位数
C 语言实例 - 判断数字为几位数 用户输入数字,判断该数字是几位数. 实例 #include <stdio.h> int main() { long long n; ; printf(& ...
- C 语言实例 - 循环输出26个字母
C 语言实例 - 循环输出26个字母 循环输出 个字母. 实例 #include <stdio.h> int main() { char c; for(c = 'A'; c <= ' ...
- 李洪强漫谈iOS开发[C语言-044]-翻译数字
李洪强漫谈iOS开发[C语言-044]-翻译数字
- R语言笔记1--向量、数组、矩阵、数据框、列表
注释:R语言是区分大小写的 1.向量 R语言中可以将各种向量赋值为一个变量,这种赋值操作符就是等号“=”,也可以使用“<-”. 1)产生向量 (1)函数c() 例如:x1=c(2,4,6,8,0 ...
- C语言博客作业06——结构体&文件
C语言博客作业06--结构体&文件 1.本章学习总结 1.1思维导图 1.2.本章学习体会 在本周的学习中,我们学习了关于结构体和文件的内容.结构体的本身并不难,但以结构体为基础的链表还是让我 ...
- 3.键盘输入10个数,放到数组中,(1)去除该数组中大于10的数 (2)将该数组中的数字写入到本地文件number.txt中
package cn.it.text; import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; ...
随机推荐
- 监听lsnrctl status查询状态报错linux error 111:connection refused
报错现象 今天给客户一个单实例环境配置监听,创建正常,查询状态异常报错 tns tns tns linux error :connection refused 匹配MOS Starting TNS L ...
- Linux发布java jar包
打包参考https://www.cnblogs.com/Rexcnblog/p/11357146.html 刚打包出来新鲜的jar 然后开始一顿猛如虎的操作了,把打包的jar和对用的sh文件拷贝到li ...
- (十一)Hibernate中的多表操作(1):单向一对多
一.单向一对多() 案例一(用XML文件配置): 一个班级有多个学生,班级可以查看所有学生的信息. ClassBean.java package bean; import java.util.Hash ...
- C#操作DOS命令,并获取处理返回值
// /*---------------- // // 文件名:Method // // 文件功能描述: // // 使用 ADB 来进行安卓设备与PC端之间的文件交互,具体adb命令操作请百度 ...
- SQL 遍历删除所有表的数据
https://www.cnblogs.com/yige/p/5193253.html declare @sqlTabName varchar(100);-- 声明游标DECLARE C_Employ ...
- 最快得到MYSQL两个表的差集
Mysql里不外乎就是 子查询 和 连接 两种方式. 设第一个表为table1, 第二个为table2, table1包含table2. sql为: //子查询 select table1.id fr ...
- pmtk3
summary A list of every PMTK3 demo auto-generated by publishDemos on 27-Mar-2012 Book Demos (1) Intr ...
- springboot启动流程(十一)aop切面处理过程
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 spring的两大核心就是ioc和aop.在关于ioc依赖注入的文章中,我们了解了如何根 ...
- C++ 函数重载二义性
说起函数重载,我不由得想起了C++的“多态”特性.多态又分为静态(编译时)多态和动态(运行时)多态,静态多态即为函数重载,动态多态则是虚函数机制.虚函数水较深,先不讨论,今天我们来看一下函数重载.作用 ...
- Linux学习笔记(八)Linux常用命令:用户登录查看命令
一.查看登录用户信息 w [用户名] 二.Who who 三.查询当前登录和过去登陆的用户信息 last 四.查看所有用户最后一次登录时间 lastlog