| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2176 人关注过本帖
标题:对于重复调用函数fgetc(fp) 下形参fp值是否改变的问题
只看楼主 加入收藏
黄昏黄昏
Rank: 2
等 级:论坛游民
帖 子:49
专家分:41
注 册:2013-1-10
结帖率:50%
收藏
 问题点数:0 回复次数:17 
对于重复调用函数fgetc(fp) 下形参fp值是否改变的问题
程序代码:
#include "stdio.h"
void main()
{
    FILE *fp;
    char fname[100],ch;
    scanf("%s",fname);
    while((fp=fopen(fname,"r+"))==NULL)
        scanf("%s",fname);
    getchar();
    ch=fgetc(fp);
    putchar(ch);
    printf("%#o\n",fp);  //这个是后来加的,验证fp的值到底有没变
    ch=fgetc(fp);
    putchar(ch);
    printf("%#o\n",fp);  //同上
    fclose(fp);
}

这个代码没什么意义,我只是想知道为什么
ch=fgetc(fp);
while(ch!=EOF)
  {
    putchar(ch);
    ch=fgetc(fp);
  }

能达到按字符输出fp所指文件文本内容的目的,因为看上去感觉怎么也该是ch=fgetc(fp++)才对呀。。
所以我写了最上面那段代码,明白ch=fgetc(fp);重复使用以后,ch的值相当于fp所指文件文本下一个字符……以此类推。
所以就顺理成章的以为,在调用函数fgetc()之后,形参的指针应该是自增的,于是为了验证,分别在两个ch=fgetc(fp); 之后加了printf("%#o\n",fp);
但是得到的结果是前后的fp值都没有变,相当于说明指针fp没有因为fgtec()的调用而改变。。
这就郁闷了,那么为什么这样的代码还能行得通呢?   我想知道第二段代码为什么能行,或者是我验证的方式错了吗?
2013-02-06 14:42
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
fp是个文件指针罢 应该是固定不变的 你说的fp++的过程应该是这些函数内部做了 你只需要调用这个函数 使用这些接口就好了 这也算一种编程的实现思想罢

至于内部如何 如何实现的 有些可以知道 有些没法知道 而且 有很多是不需要知道的 你会用就好了

祝楼主学习顺利
2013-02-06 14:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
FILE* 是一个对象句柄,虽然是指针,但它不是你所想像的那种指向什么数据的指针,而是指向一个对象块,不要乱做指针运算。

授人以渔,不授人以鱼。
2013-02-06 15:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
fp对象,*fp指向FILE,FILE其实是一个复杂的结构体,里面有一个叫做定位指示器的变量(还有许多许多你不知道也不需要知道的内部变量),用来记录当前的读写位置的(想像一下留声机的唱针就知道了),之所以所有读写函数都必须带有参数fp,就是因为要对这个结构体内部的变量进行调整,每fgetc()一个数据,凡执行fprintf()、fscanf()、fread()、fwrite()之类,那个定位器都会跟着读写数据的尺寸和个数而变化,这不会反映到fp这个指针上去——但fp之所以要用指针形式正是为了让函数寻址过去修改内部数据的。所以千万不要变动这个指针的指向。

[ 本帖最后由 TonyDeng 于 2013-2-6 15:21 编辑 ]

授人以渔,不授人以鱼。
2013-02-06 15:18
黄昏黄昏
Rank: 2
等 级:论坛游民
帖 子:49
专家分:41
注 册:2013-1-10
收藏
得分:0 
回复 2楼 zklhp
你说的 函数内部做的,如果能大概知道个过程的话也足够了,可是我根本连猜都猜不出它是怎么做到的呀。。。明明指针没变但是字符却变了,那么在调用fgetc()以后,如果需要再次从头开始(从文件文本的第一个字符),那样虽然指针没变,却不知道当前要调用fgetc()的话,fp到底指向哪里了,除非一个一个数用了几次fgetc。。另外,这个情况下,重新用fp=fopen()能解决这个问题吗?  fopen只是返回文件指针给fp而已,但是fp根本就没有变过,这样的话,是不是意味着没办法从头开始呢?

得不到的永远在骚动,被偏爱都有恃无恐
2013-02-06 15:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
C使用流数据模式,数据流是按顺序的,每读写一个数据,定位器前移,下一次的读写就从这个位置开始,可以用ftell()得到这个位置与文件头部的距离,也可以用fseek()定位到绝对位置,不过通常不鼓励绝对定位,也不鼓励来回移动定位器读写数据。

授人以渔,不授人以鱼。
2013-02-06 15:27
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
fp是什么类型的?你还当char*用呢吧

总有那身价贱的人给作业贴回复完整的代码
2013-02-06 15:29
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用黄昏黄昏在2013-2-6 15:20:17的发言:

你说的 函数内部做的,如果能大概知道个过程的话也足够了,可是我根本连猜都猜不出它是怎么做到的呀。。。明明指针没变但是字符却变了,那么在调用fgetc()以后,如果需要再次从头开始(从文件文本的第一个字符),那样虽然指针没变,却不知道当前要调用fgetc()的话,fp到底指向哪里了,除非一个一个数用了几次fgetc。。另外,这个情况下,重新用fp=fopen()能解决这个问题吗?  fopen只是返回文件指针给fp而已,但是fp根本就没有变过,这样的话,是不是意味着没办法从头开始呢?

大牛上面已经说了 这里虽然看起来像一个指针 名字也叫文件指针 但和你通常接触的指针不大一样 至于你后面的疑惑大牛也说了 祝你学习顺利
2013-02-06 16:37
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
句柄是一个集合体,包含很多的成员的,不要对这个集合体进行操作,也不要对其中的成员进行操作,会失败的

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-02-06 17:12
黄昏黄昏
Rank: 2
等 级:论坛游民
帖 子:49
专家分:41
注 册:2013-1-10
收藏
得分:0 
回复 4楼 TonyDeng
谢谢解释,我只是初学而已,你说的一些名词我只能看字面一知半解,不过我会去好好看看的,O(∩_∩)O谢谢!

得不到的永远在骚动,被偏爱都有恃无恐
2013-02-06 18:08
快速回复:对于重复调用函数fgetc(fp) 下形参fp值是否改变的问题
数据加载中...
 
   



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

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