【问题标题】:fread not working in Cfread 在 C 中不工作
【发布时间】:2014-03-09 01:06:29
【问题描述】:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int virtualAddress, pageNo, frameNo, baseAddress, offset, address, checkValue;
unsigned char basket;
printf("Enter Page Number=\n");
scanf(" %d", &virtualAddress);
pageNo=virtualAddress/256;
offset=virtualAddress%256;
frameNo=pageNo;
FILE *fp;
fp=fopen("BACKING_STORE.bin", "rb");
frameNo++;
baseAddress=frameNo*256;
address= baseAddress+offset;
    printf("\tByte=%d\n", address);

        int returnValue=fseek(fp, address,SEEK_SET);
        printf("\treturn value=%d\n", returnValue);
        printf("\tCurrent Position=%ld\n", ftell(fp));
        checkValue=fread(&basket,sizeof(char), 1,fp);
        printf("\tCheckValue=%d\n", checkValue);

printf("\nValue %d=%c ", offset, basket);
printf("\n");
    return 0;
}

我正在尝试将虚拟地址映射到物理地址。我有一个大小为 65,536 字节的文件“BACKING_STORE.bin”文件,所以我试图从用户那里获取虚拟地址,找到页码和偏移量,并假设我采用了 'pageNo=frameNo' 我正在尝试从中找到基地址,然后在向其添加偏移量后,我得到要从“BACKING_STORE.bin”读取的字节位置。 但就我而言,即使我的文件指针在文件中的正确位置,fread 也无法正常工作。我的 fread 函数调用返回 0 表示 fread 执行不成功。

【问题讨论】:

  • 您还没有正式检查文件是否打开正常,但是如果不是,您可能会崩溃,所以您可以侥幸逃脱。您尚未打印您使用的值:virtualAddresspageNooffsetbaseAddressaddress 的值都可能是相关的。您还没有向我们展示您看到的实际输出:returnValueftell(fp) 报告的值是多少?我认为您应该测试fseek(fp, 0, SEEK_END),然后测试ftell(),以确保您不会尝试从文件末尾之外读取。显示运行中的所有值会对我们有所帮助。

标签: c


【解决方案1】:

找出错误是什么:

#include <stdio.h>
#include <string.h>

char errorString[256];

sprintf(errorString, "%s\n", strerror(ferror(fp)));
printf("%s", errorString);

编辑

也许你在文件的末尾:

if(feof(fp))
    printf("End of file!\n");

【讨论】:

  • 它正在打印“成功”,但仍然没有读取正确的内容。现在我很困惑,因为它很少将 checkValue 打印为 0 现在它打印为 1 或者地址计算有问题。
  • 当我输入 virtualAddress=62493 时,它显示成功并且 checkValue=0。并且文件指针未指向文件末尾
  • 我正在寻找 baseAddress 来计算 BACKING_STORE.bin 文件中的物理地址。文件大小为 65536 字节。
  • @FiddlingBits ferror(fp) 不返回错误代码,如果出现错误,它只会返回非零值。 (但“成功”是 strerror 返回的错误代码 0,所以无论如何都没有错误)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2015-08-12
  • 2014-07-13
  • 1970-01-01
  • 2016-10-24
  • 2015-09-16
  • 1970-01-01
相关资源
最近更新 更多