| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 698 人关注过本帖
标题:文件指针读取文件内容的时候,指针的地址一直没有改变?
只看楼主 加入收藏
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
结帖率:95.24%
收藏
已结贴  问题点数:20 回复次数:14 
文件指针读取文件内容的时候,指针的地址一直没有改变?
以前一直以为文件指针读取内容后指针是向后移指向下一个字节,今天试着将函数调用两次发现其实指针地址一直没变。
为什么是这样的,求提到相关容的参考书籍。

程序代码:
#include <stdio.h>
#include <stdlib.h>

//void fun(FILE * p);

int main(void)
{
    FILE * fp;
    char ch;
    if((fp = fopen("f:\\c.txt", "r")) == NULL)
    {
        fprintf(stderr,"Error!\n");
        exit(1);
    }
    while (ch != EOF)
    {
        ch = getc(fp);
        printf("\n%p\n", fp);
        putchar(ch);
    }
    /*
    printf("%p\n", fp);
    fun(fp);    
    printf("\n%p\n", fp);    
    fun(fp);
    printf("\n%p\n", fp);
*/
    fclose(fp);
    return 0;
}
/*
void fun(FILE * p)
{
    char ch = getc(p);
    while (ch != EOF)
    {
        ch = getc(p);
        printf("\n%p\n", p);
        putchar(ch);
    }
}
*/
搜索更多相关主题的帖子: 书籍 
2015-06-04 15:50
calix
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:28
帖 子:249
专家分:1442
注 册:2015-5-4
收藏
得分:10 
源码里面是这样定义的,fp只是结构体的地址
typedef struct _iobuf
{
    char*    _ptr;
    int    _cnt;
    char*    _base;
    int    _flag;
    int    _file;
    int    _charbuf;
    int    _bufsiz;
    char*    _tmpfname;
} FILE;

楼主可以这样打印看下
程序代码:
while (ch != EOF)
    {
        ch = getc(fp);
        printf("\n%p\n", fp->_ptr);
        putchar(ch);
    }

2015-06-04 16:15
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
回复 2楼 calix
也就是说虽然是两个指针变量,但是指向的是同一个结构。第一次函数调用后时改变了结构成员_ptr的值指向了文件结尾。所以第二次再调用无输出。
要用freek()函数让结构成员中_ptr再重新指向文件开始头,才可以再行第二次调用。

人有多懒,编程就有多难。
2015-06-04 16:29
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
回复 2楼 calix
在哪里可以查到这个结构里面的每个成员的意义呢。

程序代码:
#ifndef _FILE_DEFINED
struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif

人有多懒,编程就有多难。
2015-06-04 16:36
calix
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:28
帖 子:249
专家分:1442
注 册:2015-5-4
收藏
得分:10 
char*    _ptr;这个好像没读取一次就会往后移动
char*    _base;这个始终指向文件起始
各个具体属性你每次打印下就知道了
2015-06-04 16:37
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
回复 5楼 calix
对啊,打印就知道啊,呵呵。谢谢,我去多打印几次看下。

人有多懒,编程就有多难。
2015-06-04 16:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
入魔道了,无语。

授人以渔,不授人以鱼。
2015-06-05 10:53
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
回复 7楼 TonyDeng
没目的,没方向,上班又闲。所以魔障了,哦哈哈哈…………

人有多懒,编程就有多难。
2015-06-05 11:50
你欠我人情
Rank: 2
等 级:论坛游民
威 望:1
帖 子:46
专家分:52
注 册:2015-6-5
收藏
得分:0 
多谢楼主又让我学习到了一点东西

然后在用getchar()取的时候会从上次取的后面继续取.只要这个存储的地方有字符,那么我们用getchar()时控制台就不会停顿等待我们输入字符,只有当取到换行时才是表示这个地方完全空了,下次在用getchar()的时候控制台才会停顿等待用户输入字符!

我是小白我是小白我是小白我是小白我是小白我是小白
2015-06-05 14:47
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
回复 4楼 TAAAAB
在头文件中stdio.h中可以找到关于句柄FILE的完整定义.

代码测试环境:  WinXP+C-Free5.0.
2015-06-05 16:02
快速回复:文件指针读取文件内容的时候,指针的地址一直没有改变?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021742 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved