- 论坛徽章:
- 0
|
question about fread and fwrite
问题出在fwrite上。
op_return = fwrite (tmp, object_size, object_count, my_stream);
是把从tmp开始的连续的count个size大小的内存内容拷贝到文件里面。
而tmp要模拟二维数组, 本身首先申请了4×4大小的空间
后面每个tmp都再指向一块4×4大小的空间 所以总共是加起来超过16×4的
而且更重要的是这些空间并不是连续的
请看更改后的程序:打印了tmp[0-15]的内容后,发现最后面有1 2 3 4
就再打印tmp[12]的地址,发现正好是tmp[0]的内容!
- #include <stdio.h>;
- #include <stdlib.h>;
- int main()
- {
- int row, col,i;
- int sum =0;
- FILE *my_stream;
- char my_filename[] = "my_numbers";
- size_t object_size = sizeof(int);
- size_t object_count = 16;
- size_t op_return;
- int **tmp;
- tmp = (int **)malloc((4) * sizeof(int *));
- for (i=0; i <=3; i++)
- tmp[i] = (int *)malloc((4) *sizeof(int));
- for (row = 0; row <= 3; row++)
- {
- for (col = 0; col <=3; col++)
- {
- sum++;
- tmp[row][col]=sum;
- }
- }
- fflush(stdout);
- //++++++++++++++++++++++++++++
- for(i = 0; i<16; i++)
- {
- printf("%X \n", tmp[i]);
- }
- printf("%X \n", &tmp[12]);
- //+++++++++++++++++++++++++++++++
- printf ("Initial values of array:\n");
- for (row = 0; row <= 3; row++)
- {
- for (col = 0; col <=3; col++)
- printf ("%d ",tmp[row][col]);
- printf ("\n");
- }
- my_stream = fopen (my_filename, "w");
- op_return = fwrite (tmp, object_size, object_count, my_stream);
- printf("write op_return: %d\n", op_return);
- fclose (my_stream);
- for (row = 0; row <= 3; row++)
- for (col = 0; col <=3; col++)
- tmp[row][col] = 0;
- printf ("Now reading data back in...\n");
- my_stream = fopen (my_filename, "r");
- op_return = fread (tmp, object_size, object_count, my_stream);
- printf("read op_return: %d\n", op_return);
- for (row = 0; row <= 3; row++)
- {
- for (col = 0; col<=3; col++)
- {
- printf ("%d ", tmp[row][col]);
- }
- printf ("\n");
- }
- fflush(stdout);
- //+++++++++++++++++++++++++++++++
- for(i = 0; i<16; i++)
- {
- printf("%X \n", tmp[i]);
- }
- printf("%X \n", &tmp[12]);
- //+++++++++++++++++++++++++++++++
- fclose (my_stream);
- getchar();
- return 0;
- }
复制代码
所以fwrite和fread 只是把tmp[0-15]的内容拷贝到文件里面,然后
再读出来,恰好(或者某种必然,编译器分配?),1 2 3 4写进去又
读出来了, 其他的元素在这个范围外面,没有被改动 |
|