鱼C论坛

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

fread读取失败

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

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

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

x
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    FILE *in = fopen("data.in", "rb");
   // if(in == NULL) cout << "FAIL"; else cout << "OK";
    FILE *out = fopen("b.txt", "w");
    int a[11];
    int t = fread(&a[10], 4, 1, in);
    for(int i = 9; i >= 1; i--) {
        a[i] = (a[i + 1] + 1) * 2;
    }
    for(int i = 1; i <= 10; i++) {
       // fprintf(out, "%d\n", a[i]);
    }
    cout << a[10] << ' ' << t;
}

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

使用道具 举报

发表于 2018-1-22 14:29:03 | 显示全部楼层
char a[11];
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思,还是不明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好吧,当我没说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

using namespace std;

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

        cout << a[10] << ' ' << t;
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

还是不行哪,我在codeblocks上面跑,t还是显示为0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

using namespace std;

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

        cout << "0x" << std::hex << a[0] << ' ';
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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。有始有终。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-1 09:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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