Hermione 发表于 2018-1-22 11:27:34

fread读取失败

#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;
    int t = fread(&a, 4, 1, in);
    for(int i = 9; i >= 1; i--) {
      a = (a + 1) * 2;
    }
    for(int i = 1; i <= 10; i++) {
       // fprintf(out, "%d\n", a);
    }
    cout << a << ' ' << t;
}

data.in里面只有一个数1,而且确定FILE *in是读取成功了的。但是,cout验证发现,a = 2686513, t = 1,也就是说,读取是失败的,请问我哪里错了?

ba21 发表于 2018-1-22 14:29:03

char a;

Hermione 发表于 2018-1-22 15:47:10

ba21 发表于 2018-1-22 14:29
char a;

不好意思,还是不明白

ba21 发表于 2018-1-22 18:43:31

Hermione 发表于 2018-1-22 15:47
不好意思,还是不明白

好吧,当我没说

人造人 发表于 2018-1-22 20:14:20

#include <iostream>
#include <cstdio>

using namespace std;

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

        cout << a << ' ' << t;
      return 0;
}

Hermione 发表于 2018-1-24 23:49:53

人造人 发表于 2018-1-22 20:14


还是不行哪,我在codeblocks上面跑,t还是显示为0

人造人 发表于 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;
        FILE *in = fopen("data.in", "rb");
        int t = fread(a, 4, 1, in);

        cout << "0x" << std::hex << a << ' ';
        return 0;
}

musilintan 发表于 2018-1-25 13:57:46

int t = fread(&a, 4, 1, in);

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

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

还有,不管写啥,一定要在用完句柄后释放掉。你光打开文件,却不关闭文件。这种习惯很不好。要fclose。有始有终。
页: [1]
查看完整版本: fread读取失败