用C语言储存数组后读取失败

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
    int a[10][10];
    srand(time(NULL));
    int i,j;
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            a[i][j]=rand()%10;
            printf("%d\t",a[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    FILE *fp=fopen("./a_matrix","wb+");
    if(fp)
    {
        int size=fwrite(a,sizeof(a),1,fp);
        if(size==1)
        {
            int b[10][10];
            fread(b,sizeof(b),1,fp);
            if(feof(fp))
            {
                for(i=0;i<10;i++)
                {
                    for(j=0;j<10;j++)
                    {
                        printf("%d\t",b[i][j]);
                    }
                    printf("\n");
                }
            }
        }
        fclose(fp);
    }
    return 0;
}

某次使用gcc编译运行后得到的结果为:
8 3 5 9 4 9 0 5 2 7
4 2 2 3 4 9 4 6 3 7
6 7 1 1 4 4 7 0 3 5
9 4 0 6 3 5 7 5 2 2
4 8 4 6 2 0 7 8 6 3
5 3 0 6 4 6 2 4 7 6
1 8 0 2 7 5 9 4 3 3
6 9 2 3 8 6 3 7 4 0
0 2 5 2 8 9 9 3 5 6
9 7 4 1 9 1 8 0 8 3

2 32546 0 0 510347552 32766 3 0 510347536 32766
0 0 -769542344 32546 0 0 1 0 -769542384 32546
0 0 1700966438 0 -769541480 32546 510347704 32766 510347760 32766
-769542384 32546 0 0 -771763729 32546 0 0 510347760 32766
0 0 0 0 0 0 -769542384 32546 -774158457 32546
0 0 510347536 32766 510347552 32766 -769541480 32546 0 0
0 0 510347568 32766 -1 0 0 0 510943848 32766
-769542384 32546 0 0 0 0 0 0 1970169159 0
9 0 -771799456 32546 510347720 32766 15775231 0 1 0
-449672227 22095 -771741280 32546 0 0 -449672304 22095 -449673168 22095

我想不明白为什么会出现这样的结果

阅读 2.5k
2 个回答

可以描述一下你要做什么吗?我的理解是你希望将内存中产生的一组随机数矩阵写到一个空白文件中,然后再从文件中读取验证写入是否成功?但你的代码并没有任何写数组到文件的过程啊?而且,这样的话写入和读取必须是分开进行的,否则会导致文件指针错乱,最好分为两个文件两个程序进行,次之一个程序两个函数也可以。另外,fwrite()的写操作实际上是写到内存缓冲区而不是直接写到文件,需要用fflush()fclose()将缓冲区中的内容强制刷新到文件中,否则文件中可能是没有任何内容的。最后,你的代码中fread()读取的数据始终存储到的是同一个内存位置b,这样展示的结果自然也不可能是正确的。
附上一个修改后的代码作为参考:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void write_matrix(FILE *fp)
{
    int a[10][10];
    srand(time(NULL));
    int i, j;
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            a[i][j]=rand()%10;
            fwrite(&a[i][j], sizeof(int), 1, fp);
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
}

void read_matrix(FILE *fp, int(*b)[10])
{
    int i, j;
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            fread(&b[i][j], sizeof(int), 1, fp);
        }
    }
}

int main()
{
    FILE *fp = fopen("./a_matrix", "wb");
    if(fp)
    {
        write_matrix(fp);
        fclose(fp);
    }
    printf("\n");

    fp = fopen("./a_matrix", "rb");
    if(fp)
    {
        int b[10][10];
        int i, j;
        read_matrix(fp, b);
        for(i=0;i<10;i++)
        {
            for(j=0;j<10;j++)
            {
                printf("%d\t", b[i][j]);
            }
            printf("\n");
        }
        fclose(fp);
    }
    return 0;
}

你用fwrite写入文件后紧接着又fread,程序会从文件末尾读取,当然就错了。在fread之前用rewind(fp)重置一下文件位置即可。