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也得到了解决。

  • 相关阅读:
    新概念第二册(1)--英语口语听力课1
    外企面试课程(一)---熟悉常见的缩略词
    公司 邮件 翻译 培训 长难句 结课
    workflow
    公司 邮件 翻译 培训 长难句 20
    公司 邮件 翻译 培训 长难句 19
    Engineering Management
    公司 邮件 翻译 培训 长难句 18
    公司 邮件 翻译 培训 长难句 17
    第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头
  • 原文地址:https://www.cnblogs.com/kabe/p/5047356.html
Copyright © 2011-2022 走看看