| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2451 人关注过本帖
标题:[求助]fgets函数使用请教
只看楼主 加入收藏
wangjian2006
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-9
收藏
 问题点数:0 回复次数:12 
[求助]fgets函数使用请教

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: wangjian2006 QQ:464663391
*/ 时间: 2007-7-9 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------


先看一段小代码

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

void main()
{
FILE *in = NULL;
char *p = NULL;
char xx[3][3] = {0, };
int i = 0;

//打开in.dat文件,该文件中有两行数据,第一行为11,第二行为22
in = fopen("in.dat","r");

//第一次调用fgets函数
p = fgets(xx[0],3,in);
printf("\nxx[0] = %s",xx[0]);

//第二次调用fgets函数
p = fgets(xx[0],3,in);
printf("\nxx[0] = %s",xx[0]);

*p = NULL;
fclose(in);
};


可能大家都知道输出结果理所当然是:
11
22

我的疑问是在执行fgets(xx[0],3,in)前后,指针in不变,返回的指针p也不会变(都是指向&xx[0][0]);

那么程序凭借什么在第二次执行fgets时去从第二行开始获取??

不知道我表达的意思大家明白不?或许程序自己定义了一个指针来指向执行后的开始地址?

[此贴子已经被作者于2007-7-9 23:20:03编辑过]

搜索更多相关主题的帖子: fgets 函数 中国 include 
2007-07-09 22:06
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 
你那个程序读取不了 第二行 也不可能输出的是你那个结果
in指针是文件流指针 不可能指向(都是指向&xx[0][0]);
我看你文件学的太不扎实了 你在重新学一边吧
还有 以后发求助帖的时候不开【原创】
下面是我改的程序
#include<stdio.h>
#include<string.h>
void main()
{
FILE *in;
char xx[3][3];
int i = 0;
//打开in.dat文件,该文件中有两行数据,第一行为11,第二行为22
in = fopen("in.txt","r");
//第一次调用fgets函数
fgets(xx[0],4,in);
printf("\nxx[0] = %s",xx[0]);

//第二次调用fgets函数
fgets(xx[1],3,in);
printf("\nxx[1] = %s",xx[1]);
fclose(in);
}

羊肉串 葡萄干 哈密瓜!!
2007-07-09 22:45
wangjian2006
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-9
收藏
得分:0 

楼上的同志,没看懂我的问题就开始批人一顿,都替你捏把汗

2007-07-09 23:16
wangjian2006
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-9
收藏
得分:0 
不过有一点你确实说对了,代码是我随手写的,没有编译过,结果确实错了。

正确结果是:
11
11

奇怪了,可能是我之前碰到的问题哪里记录有误。。正在改代码再看看
2007-07-09 23:18
wangjian2006
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-9
收藏
得分:0 

晓得问题出在哪了
#include<stdio.h>
#include<string.h>

void main()
{
FILE *in = NULL;
char *p = NULL;
char xx[3][3] = {0, };
int i = 0;

//打开in.dat文件,该文件中有两行数据,第一行为11,第二行为22
in = fopen("in.dat","r");

//第一次调用fgets函数
p = fgets(xx[0],4,in);
printf("\nxx[0] = %s",xx[0]);

//第二次调用fgets函数
p = fgets(xx[0],4,in);
printf("\nxx[0] = %s",xx[0]);

*p = NULL;
fclose(in);
};

2楼的同志提醒了我,要读(4-1)位,这样才能读到'\n',这也似乎回答了我自己的问题 ,只有在读到'\n'的情况下,第二次调用gets时才会读第二行。

2007-07-09 23:25
wangjian2006
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-9
收藏
得分:0 

那程序到底是怎样实现的,在读到'\n'的情况下“记忆”一次,然后第二次调用gets时才会读下一行?

in 始终指向文件头;
p 始终指向&xx[0][0];

2007-07-09 23:29
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 
你怎么知道in始终指向文件头呢?‘
in始终指向文件头的话 为什么我的那个程序能读取到 22呢?

[此贴子已经被作者于2007-7-9 23:53:17编辑过]


羊肉串 葡萄干 哈密瓜!!
2007-07-09 23:48
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
2007-07-09 23:57
wangjian2006
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-9
收藏
得分:0 
以下是引用mp3aaa在2007-7-9 23:48:29的发言:
你怎么知道in始终指向文件头呢?‘
in始终指向文件头的话 为什么我的那个程序能读取到 22呢?

我也一直以为in所指向的值会变,结果我在VC下一调试,结果都是指向文件头,所以我才纳闷来这里提问

2007-07-10 00:01
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 

啊? 你怎么调试的?


羊肉串 葡萄干 哈密瓜!!
2007-07-10 00:22
快速回复:[求助]fgets函数使用请教
数据加载中...
 
   



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

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