zoukankan      html  css  js  c++  java
  • 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也得到了解决。

  • 相关阅读:
    FTP文件乱码和传输模式解释
    win7(x64)+VS2012+cocos2d-x环境的配置以及试运行
    XCode详解及iOSApp上传
    WP8教程
    Windows Phone 8 开发环境搭建
    Wp8开发环境搭建总结
    跟随玩家
    JniHelper 含安卓推送
    软硬结合第二篇——酷我音乐盒的逆天玩法
    IOS ITunesConnect 修改开发商名称
  • 原文地址:https://www.cnblogs.com/kabe/p/5047356.html
Copyright © 2011-2022 走看看