鱼C论坛

 找回密码
 立即注册
查看: 3635|回复: 7

fread读取失败

[复制链接]
发表于 2018-1-22 11:27:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;

  4. int main()
  5. {
  6.     FILE *in = fopen("data.in", "rb");
  7.    // if(in == NULL) cout << "FAIL"; else cout << "OK";
  8.     FILE *out = fopen("b.txt", "w");
  9.     int a[11];
  10.     int t = fread(&a[10], 4, 1, in);
  11.     for(int i = 9; i >= 1; i--) {
  12.         a[i] = (a[i + 1] + 1) * 2;
  13.     }
  14.     for(int i = 1; i <= 10; i++) {
  15.        // fprintf(out, "%d\n", a[i]);
  16.     }
  17.     cout << a[10] << ' ' << t;
  18. }
复制代码


data.in里面只有一个数1,而且确定FILE *in是读取成功了的。但是,cout验证发现,a[10] = 2686513, t = 1,也就是说,读取是失败的,请问我哪里错了?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-1-22 14:29:03 | 显示全部楼层
char a[11];
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-22 15:47:10 | 显示全部楼层

不好意思,还是不明白
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-22 18:43:31 | 显示全部楼层
Hermione 发表于 2018-1-22 15:47
不好意思,还是不明白

好吧,当我没说
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-22 20:14:20 | 显示全部楼层
  1. #include <iostream>
  2. #include <cstdio>

  3. using namespace std;

  4. int main(void)
  5. {
  6.         int a[11];
  7.         FILE *in = fopen("data.in", "rb");
  8.         int t = fread(&a[10], 4, 1, in);

  9.         cout << a[10] << ' ' << t;
  10.         return 0;
  11. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-24 23:49:53 | 显示全部楼层

还是不行哪,我在codeblocks上面跑,t还是显示为0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-25 00:07:38 | 显示全部楼层
Hermione 发表于 2018-1-24 23:49
还是不行哪,我在codeblocks上面跑,t还是显示为0
  1. #include <iostream>
  2. #include <cstdio>

  3. using namespace std;

  4. int main(void)
  5. {
  6.         int a[11];
  7.         FILE *in = fopen("data.in", "rb");
  8.         int t = fread(a, 4, 1, in);

  9.         cout << "0x" << std::hex << a[0] << ' ';
  10.         return 0;
  11. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-25 13:57:46 | 显示全部楼层
int t = fread(&a[10], 4, 1, in);

这句话的意思是从in中读取4个字节保存到 &a[10]这个指针的位置。
1.首先你的a数组只有11个元素,也就是只有0-10这11个有效空间。&[10]代表的是最后一个元素的当前空间地址位置。这样做的结果就是会把从in中读取的字节保存到最后一个元素中。但是,数组明明只有1个空间了,但你还非要往里面读4个元素。这样是会溢出的。

改成这样:int t = fread(&a[10], 1, 1, in);只从in中读取1个字符并赋值给a[10]。t是返回的读取数。

还有,不管写啥,一定要在用完句柄后释放掉。你光打开文件,却不关闭文件。这种习惯很不好。要fclose。有始有终。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-5 23:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表