用fprintf写入后用fread读取都是0 (double型)


/*    从键盘输入10个double型,将其写入文件,然后用fread读取输出至数组。 
*/
#include<stdio.h>

int main()
{
    FILE *fp;
    double no;
    int i=0;
    if( (fp=fopen("数组double.bin","wb"))==NULL )
        printf("打开文件失败。\n");
    else
    {
        puts("输入10个double:");
        while(    i<10    )
        {
            printf("输入第%d个数:",i+1);
            scanf("%lf",&no);     
            fprintf(fp,"%lf\n",no);
            i++; 
        }
        fclose(fp);
    }
 
//下面 进行读取。 
    double zu[10];
    if(    (fp=fopen("数组double.bin","rb"))==NULL    )
        printf("打开文件失败。\n");
    else
    {
        fread(zu,sizeof(double),10,fp) ;//读取结束,下面显示。 
        for(i=0;i<10;i++)
            printf("zu[%d]:%lf\n",i+1,zu[i]);
        fclose(fp);
    }
    
    return 0;
}

下面是输出结果:
输入10个double:
输入第1个数:123.1
输入第2个数:123.2
输入第3个数:123.3
输入第4个数:123.4
输入第5个数:123.5
输入第6个数:456.77
输入第7个数:456.888
输入第8个数:99.100
输入第9个数:60.111
输入第10个数:100.112

zu[1]:0.000000
zu[2]:0.000000
zu[3]:0.000000
zu[4]:0.000000
zu[5]:0.000000
zu[6]:0.000000
zu[7]:0.000000
zu[8]:0.000000
zu[9]:0.000000
zu[10]:0.000000

你用fprintf写文件,读文件就要用fscanf读,fread在读取的时候,会出现字节序颠倒的问题,也就是说,fread在读取数据的时候,是按照低位在前,高位在后的字节顺序读取数据,而且,读取的数据是字符,然后再转成double类型。但是fprintf在写文件的时候,直接是把数字转成相应的字符了。举个简单的例子,数字53用fprintf写文件,文件中的内容就是53,但是fread在读取的时候,会把53作为一个字符(53好像是字符'5'的ascii码)读进来,这样就会出现错误

我自己猜测,是因为 fread(zu,sizeof(double),10,fp) 读取的要是数组吗,而输入文件的是10个double型,不算是数组。 返回值都检查过了,应该没有问题。