首页
社区
课程
招聘
FILE缓冲区问题
发表于: 2011-2-8 17:13 5643

FILE缓冲区问题

2011-2-8 17:13
5643
我用file = fopen(文件)后 (MFC中)
这个file的_base就4096个大小
当我fgets(file)4096次后
就根本读取不了
请问:如何更新这个缓冲区?使得能继续朝后面读取文件内容(4097、4098、、、、)
PS:goole了1晚、貌似没发现网上有这个问题 - -

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 128
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
估计你以文本方式打开
你试试 fopen(文件名,"rb")看
2011-2-9 08:26
0
雪    币: 232
活跃值: (105)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
不行
这貌似跟什么方式打开没啥关系吧
MFC里的FILE类型
默认的缓冲区大小就是0x1000
它打开后就读取0x1000(如何文件大小大于0x1000)
我用fget和fread都只是在这个缓冲区里获取
所以当大小超过0x1000后,就根本获取不了
2011-2-9 11:58
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个你应该看看
fopen 和 fgets 函数的帮助
缓冲区不需要你自己去更新的,对你是透明的
你fgets的时候,他自己会决定更新的
2011-2-9 18:42
0
雪    币: 232
活跃值: (105)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
可是。。。
我for(int i = 0 ;i<10000;i++)
{
S = fget(file);
}
当i超过0x1000后
根本就没更新..
S获得的一直是0xff
2011-2-9 20:49
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你中间需要判断 EOF 如果eof 返回为true ,那么就是已经到了文件结尾了,你怎么读都没用了……
如果判断出 eof 那么你的循环就要 break;

参考函数  int feof( FILE * );
2011-2-9 23:08
0
雪    币: 232
活跃值: (105)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
        FILE* file;
        file = fopen(name,"rd");
        if(file!=NULL)
        {
                fseek(file, 0L, SEEK_SET);
                fseek(file, 0L, SEEK_END);
                filelen = ftell(file);
                filebuffer = (char*)malloc(filelen);
                fseek(file, 0L, SEEK_SET);
                for(int i = 0;i<filelen;i++)
                {
                        s = fread(filebuffer,1,1,file);
                        filebuffer[i] = s;
                        if(i % 4096 == 0)
                        {
                                i =i;
                        }
                }


不是你想的那样
我是读取一个3MB的文件
到了0x1000后
fget就没用了
上面是代码
2011-2-10 11:41
0
雪    币: 201
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
那就是如何修改_base的问题了 能不能照这个思路google一下 关注中
2011-2-11 00:24
0
雪    币: 201
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
在一轮4096后使用feek(file, 4096, SEEK_CUR)
试试在每一次读满4096字节后移动文件指针 看文件指针所指向的结构体会不会自己清空base缓冲区
2011-2-11 00:41
0
雪    币: 128
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
s = fread(filebuffer,1,1,file);
      filebuffer[i] = s;
这两句写的蛮怪异, s应该总是1或0, 正确写法应该是(除非你有意这样做)
      s = fread(filebuffer+i,1,1,file);
你可以检查4096后, s是否为1(fread读一个字符), 如果为0, 使用ferror or feof 去检查为啥错
2011-2-11 08:50
0
雪    币: 232
活跃值: (105)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
11
不好意思
复制错了
那些都是我调试时候试验的
原来的是

    for(int i = 0;i<filelen;i++)
    {
      s = fgetc(file);
      filebuffer[i] = s;
      if(i % 4096 == 0)
      {
        i =i;
      }
    }
2011-2-11 18:26
0
雪    币: 232
活跃值: (105)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
12

太奇怪了。。。。
我换了个文件
发现又成功了
可是原来的就是不行
我原来的是 打开"ntoskrnl.exe"
确实如smallkin所说
缓冲区是自动更新的
而且我跟了一下
当i = 1008后
s读取的就一直是0xff
用getlasterror 得到的是0:操作成功
我本来是想写个代码定位器
想把内核里的代码和文件想对应起来
2011-2-11 18:56
0
雪    币: 128
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
应该用ferror而不是getlasterror, 具体你去查ms手册
2011-2-15 08:40
0
游客
登录 | 注册 方可回帖
返回
//