免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1417 | 回复: 3
打印 上一主题 下一主题

question about fread and fwrite [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-27 00:10 |只看该作者 |倒序浏览
我真在谢谢一个小coding,巴数字放在两维数组里,然后把数组写在文件中,但是,当我读取的时候,我只能拿到第一行,别的拿不到,为什么?
#include <stdio.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;
}
printf ("\n";
}
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);
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);

for (row = 0; row <= 3; row++)
{
for (col = 0; col<=3; col++)
{
printf ("%d ", tmp[row][col]);
}
printf ("\n";
}
fclose (my_stream);
return 0;
}

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-06-27 19:29 |只看该作者

question about fread and fwrite

c语言中数组下标从0开始的。
好好看教材吧。
代码写的很怪异。

论坛徽章:
0
3 [报告]
发表于 2004-06-28 04:30 |只看该作者

question about fread and fwrite

你说的这点我知道,问题不在这里。我没有给零行和零列的元素付值而已。即使你把row=1改为row=0,结果是一样的。

论坛徽章:
0
4 [报告]
发表于 2004-06-29 16:12 |只看该作者

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]的内容!

  1. #include <stdio.h>;
  2. #include <stdlib.h>;

  3. int main()
  4. {
  5. int row, col,i;
  6. int sum =0;
  7. FILE *my_stream;
  8. char my_filename[] = "my_numbers";
  9. size_t object_size = sizeof(int);
  10. size_t object_count = 16;
  11. size_t op_return;
  12. int **tmp;

  13. tmp = (int **)malloc((4) * sizeof(int *));
  14. for (i=0; i <=3; i++)
  15. tmp[i] = (int *)malloc((4) *sizeof(int));

  16. for (row = 0; row <= 3; row++)
  17. {
  18.    for (col = 0; col <=3; col++)
  19.    {
  20.       sum++;
  21.       tmp[row][col]=sum;
  22.    }
  23. }

  24. fflush(stdout);

  25. //++++++++++++++++++++++++++++
  26. for(i = 0; i<16; i++)
  27. {
  28.   printf("%X \n", tmp[i]);
  29. }
  30. printf("%X \n", &tmp[12]);
  31. //+++++++++++++++++++++++++++++++
  32. printf ("Initial values of array:\n");
  33. for (row = 0; row <= 3; row++)
  34. {
  35.    for (col = 0; col <=3; col++)
  36.      printf ("%d ",tmp[row][col]);
  37.    printf ("\n");
  38. }

  39. my_stream = fopen (my_filename, "w");
  40. op_return = fwrite (tmp, object_size, object_count, my_stream);
  41. printf("write op_return: %d\n", op_return);
  42. fclose (my_stream);

  43. for (row = 0; row <= 3; row++)
  44. for (col = 0; col <=3; col++)
  45. tmp[row][col] = 0;

  46. printf ("Now reading data back in...\n");
  47. my_stream = fopen (my_filename, "r");
  48. op_return = fread (tmp, object_size, object_count, my_stream);
  49. printf("read op_return: %d\n", op_return);
  50. for (row = 0; row <= 3; row++)
  51. {

  52.     for (col = 0; col<=3; col++)
  53.     {
  54.       printf ("%d ", tmp[row][col]);
  55.     }
  56.     printf ("\n");
  57. }  
  58. fflush(stdout);

  59. //+++++++++++++++++++++++++++++++
  60. for(i = 0; i<16; i++)
  61. {
  62.   printf("%X \n", tmp[i]);
  63. }
  64. printf("%X \n", &tmp[12]);
  65. //+++++++++++++++++++++++++++++++
  66. fclose (my_stream);

  67. getchar();
  68. return 0;
  69. }
复制代码


所以fwrite和fread 只是把tmp[0-15]的内容拷贝到文件里面,然后
再读出来,恰好(或者某种必然,编译器分配?),1 2 3 4写进去又
读出来了, 其他的元素在这个范围外面,没有被改动
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP